Целесообразность использования unsigned (Философски-религиозный вопрос)

Модератор: Модераторы разделов

sbar
Сообщения: 354
ОС: Gentoo

Целесообразность использования unsigned

Сообщение sbar »

Где принято использовать беззнаковые типы данных, а где нет? Почему в циклах for я почти всегда вижу for (int i=0 даже если точно известно, что i никогда не будет отрицательным числом? Также, компилятор C++ не дает мне объявить int main(unsigned int argc, char **argv), но ведь количество аргументов программы не может быть отрицательным.
Почему так происходит? Людям лень писать такое длинное слово или unsigned не используют там где точно известно что значение переменной не может выйти за пределы signed или в этом есть более глубокий смысл?
Спасибо сказали:
Sleeping Daemon
Сообщения: 1450

Re: Целесообразность использования unsigned

Сообщение Sleeping Daemon »

sbar писал(а):
19.01.2009 09:32
Где принято использовать беззнаковые типы данных, а где нет? Почему в циклах for я почти всегда вижу for (int i=0 даже если точно известно, что i никогда не будет отрицательным числом? Также, компилятор C++ не дает мне объявить int main(unsigned int argc, char **argv), но ведь количество аргументов программы не может быть отрицательным.
Почему так происходит? Людям лень писать такое длинное слово или unsigned не используют там где точно известно что значение переменной не может выйти за пределы signed или в этом есть более глубокий смысл?

Вы в курсе, что такое прототип функции?
Посмотрите прототип функции main.
Спасибо сказали:
Аватара пользователя
bormant
Сообщения: 1354

Re: Целесообразность использования unsigned

Сообщение bormant »

Кроме того, беззнаковая арифметика требует более внимательного отношения к построению выражений, склонна провоцировать ошибки наподобие if ((unsigned_expr)<0); while ((unsigned_expr)>0) {...; i-=2}.
Спасибо сказали:
Аватара пользователя
RasenHerz
Сообщения: 1341
ОС: Arch Linux amd64

Re: Целесообразность использования unsigned

Сообщение RasenHerz »

unsigned я использую когда необходима работа с битами, с адресацией(здесь чаще unsigned long). с устройствами, ну или когда вместимости для целых положительных чисел у int не хватает.
Спасибо сказали:
sbar
Сообщения: 354
ОС: Gentoo

Re: Целесообразность использования unsigned

Сообщение sbar »

Sleeping Daemon писал(а):
19.01.2009 10:04
Вы в курсе, что такое прототип функции? Посмотрите прототип функции main.
Компилятор C (gcc 4.3.2) почему-то дал мне объявить int main(unsigned int, char**), а C++ - нет. (Интересно, кстати, почему? Я изучаю C++ сейчас, но полагаю понятие "прототип функции" существует и в Си)

bormant писал(а):
19.01.2009 11:13
Кроме того, беззнаковая арифметика требует более внимательного отношения к построению выражений, склонна провоцировать ошибки наподобие if ((unsigned_expr)&lt;0); while ((unsigned_expr)&gt;0) {...; i-=2}.
На эту проблему уже напоролся, да.

RasenHerz писал(а):
19.01.2009 15:56
unsigned я использую когда необходима работа с битами, с адресацией(здесь чаще unsigned long). с устройствами, ну или когда вместимости для целых положительных чисел у int не хватает.
Ok, спасибо. Буду использовать unsigned только там где это действительно необходимо. :)
Спасибо сказали:
Аватара пользователя
AestheteAnimus
Сообщения: 135
ОС: FreeBSD 8.0-RELEASE amd64

Re: Целесообразность использования unsigned

Сообщение AestheteAnimus »

sbar писал(а):
19.01.2009 09:32
Где принято использовать беззнаковые типы данных, а где нет? Почему в циклах for я почти всегда вижу for (int i=0 даже если точно известно, что i никогда не будет отрицательным числом? Также, компилятор C++ не дает мне объявить int main(unsigned int argc, char **argv), но ведь количество аргументов программы не может быть отрицательным.
Почему так происходит? Людям лень писать такое длинное слово или unsigned не используют там где точно известно что значение переменной не может выйти за пределы signed или в этом есть более глубокий смысл?

Вообще говоря, в Си любое встретившееся в в исходнике число имеет тип int - так уж повелось. Более того, символ ('a', 'b') тоже не более чем число и имеет тип int.

Тем не менее, я если не хотите наступить на какие-нибудь кроссплатформенные грабли, то лучше int, unsigned и прочие родовые типы не использовать. К примеру, если Вам нужно большое число, лучше использовать int32_t/int64_t. Если нужен байтовый массив, лучше подходит uint8_t. Если нужен индекс для массива, стоит использовать size_t, этот тип имеет достаточный размер, чтобы занумеровать всю адресуемую процессором память. Для хранения указателя в виде числа (иногда и это надо) придусмотрены типы uintptr_t/intptr_t Собственно, в стандарте обяъвлено достаточно много подобных типов.
Спасибо сказали:
Аватара пользователя
Doka
Сообщения: 715
Статус: ASIC Design Engineer
ОС: RHEL4

Re: Целесообразность использования unsigned

Сообщение Doka »

AestheteAnimus
>> Собственно, в стандарте обяъвлено достаточно много подобных типов.

а что за стандарт такой?!.. аж интересно стало
Never stop thinking..................................................................
Спасибо сказали:
Аватара пользователя
AestheteAnimus
Сообщения: 135
ОС: FreeBSD 8.0-RELEASE amd64

Re: Целесообразность использования unsigned

Сообщение AestheteAnimus »

Doka писал(а):
20.01.2009 13:34
а что за стандарт такой?!.. аж интересно стало

C99, о плюсах я речи не веду.
Спасибо сказали:
sbar
Сообщения: 354
ОС: Gentoo

Re: Целесообразность использования unsigned

Сообщение sbar »

Doka писал(а):
20.01.2009 13:34
а что за стандарт такой?!.. аж интересно стало

Для Си - ISO/IEC 9899:1990, для C++ - ISO/IEC 14882:1998.
Спасибо сказали:
Аватара пользователя
AestheteAnimus
Сообщения: 135
ОС: FreeBSD 8.0-RELEASE amd64

Re: Целесообразность использования unsigned

Сообщение AestheteAnimus »

sbar писал(а):
20.01.2009 17:58
Для Си - ISO/IEC 9899:1990

Старенький у вас стандарт, батенька ;)
Спасибо сказали:
Аватара пользователя
deninok
Сообщения: 585
Статус: Программист С++
ОС: Debian GNU/Linux

Re: Целесообразность использования unsigned

Сообщение deninok »

(sbar) писал(а):Для Си - ISO/IEC 9899:1990, для C++ - ISO/IEC 14882:1998.

Уточнение: на сегодняшний день актуальны: для С - ISO/IEC 9899:1999, для С++ - ISO/IEC 14882:2003
Спасибо сказали:
KernelPanic
Бывший модератор
Сообщения: 2060
Статус: Brain Атаке
ОС: Debian squeeze/sid/exp

Re: Целесообразность использования unsigned

Сообщение KernelPanic »

sbar писал(а):
19.01.2009 21:46
Компилятор C (gcc 4.3.2) почему-то дал мне объявить int main(unsigned int, char**), а C++ - нет. (Интересно, кстати, почему? Я изучаю C++ сейчас, но полагаю понятие "прототип функции" существует и в Си)
Потому что для компиляторов C типы данных играют второстепенную роль. Для компиляторов C++ проверка типов данных стоит практически на первом месте.

В случае с компилятором Си, значимым для компилятора является именно имя функции. Т.е. внутреннее представление при обращении к функции main будет одноименным, т.е. main. В данном случае ничего криминального при передаче первого аргумента типа unsigned int не произошло, поэтому такая программа даже может заработать.

В случае же компилятора C++, значимым будет и имя функции и типы аргуметов, т.е. внутреннее представление функции main будет иметь вид main_int_char (это для прототипа). Вы же пытаетесь обратиться к функции с внутренним представлением main_unsigned_int_char, у которой нет прототипа, отсюда и ошибка при компиляции.

Это объяснение достаточно условное, но, надеюсь, вполне понятное, чтобы увидеть разницу в работе компиляторов.
Спасибо сказали:
Аватара пользователя
Folderx
Сообщения: 296
ОС: fedora, mandriva

Re: Целесообразность использования unsigned

Сообщение Folderx »

(AestheteAnimus) писал(а):Вообще говоря, в Си любое встретившееся в в исходнике число имеет тип int - так уж повелось.

не, десятичная константа принимает первый подходящий из int, long int, unsigned long int
8ричная и 16ричная первый подходящий из int, unsigned int, long int, unsigned long int
причём, не надо думать что int == long int, или что long int может быть больше int'а только в два раза, сказано только что long int не короче int, int не короче short int и что _тип_ и unsigned _тип_ одного размера
ещё есть суффиксы (с ними тоже перебор ведётся)
Спасибо сказали: