Где принято использовать беззнаковые типы данных, а где нет? Почему в циклах for я почти всегда вижу for (int i=0 даже если точно известно, что i никогда не будет отрицательным числом? Также, компилятор C++ не дает мне объявить int main(unsigned int argc, char **argv), но ведь количество аргументов программы не может быть отрицательным.
Почему так происходит? Людям лень писать такое длинное слово или unsigned не используют там где точно известно что значение переменной не может выйти за пределы signed или в этом есть более глубокий смысл?
Целесообразность использования unsigned (Философски-религиозный вопрос)
Модератор: Модераторы разделов
-
Sleeping Daemon
- Сообщения: 1450
Re: Целесообразность использования unsigned
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
Кроме того, беззнаковая арифметика требует более внимательного отношения к построению выражений, склонна провоцировать ошибки наподобие if ((unsigned_expr)<0); while ((unsigned_expr)>0) {...; i-=2}.
-
RasenHerz
- Сообщения: 1341
- ОС: Arch Linux amd64
Re: Целесообразность использования unsigned
unsigned я использую когда необходима работа с битами, с адресацией(здесь чаще unsigned long). с устройствами, ну или когда вместимости для целых положительных чисел у int не хватает.
-
sbar
- Сообщения: 354
- ОС: Gentoo
Re: Целесообразность использования unsigned
Компилятор C (gcc 4.3.2) почему-то дал мне объявить int main(unsigned int, char**), а C++ - нет. (Интересно, кстати, почему? Я изучаю C++ сейчас, но полагаю понятие "прототип функции" существует и в Си)Sleeping Daemon писал(а): ↑19.01.2009 10:04Вы в курсе, что такое прототип функции? Посмотрите прототип функции main.
На эту проблему уже напоролся, да.
Ok, спасибо. Буду использовать unsigned только там где это действительно необходимо.
-
AestheteAnimus
- Сообщения: 135
- ОС: FreeBSD 8.0-RELEASE amd64
Re: Целесообразность использования unsigned
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
AestheteAnimus
>> Собственно, в стандарте обяъвлено достаточно много подобных типов.
а что за стандарт такой?!.. аж интересно стало
>> Собственно, в стандарте обяъвлено достаточно много подобных типов.
а что за стандарт такой?!.. аж интересно стало
Never stop thinking..................................................................
-
AestheteAnimus
- Сообщения: 135
- ОС: FreeBSD 8.0-RELEASE amd64
-
sbar
- Сообщения: 354
- ОС: Gentoo
-
AestheteAnimus
- Сообщения: 135
- ОС: FreeBSD 8.0-RELEASE amd64
-
deninok
- Сообщения: 585
- Статус: Программист С++
- ОС: Debian GNU/Linux
Re: Целесообразность использования unsigned
(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
Потому что для компиляторов C типы данных играют второстепенную роль. Для компиляторов C++ проверка типов данных стоит практически на первом месте.
В случае с компилятором Си, значимым для компилятора является именно имя функции. Т.е. внутреннее представление при обращении к функции main будет одноименным, т.е. main. В данном случае ничего криминального при передаче первого аргумента типа unsigned int не произошло, поэтому такая программа даже может заработать.
В случае же компилятора C++, значимым будет и имя функции и типы аргуметов, т.е. внутреннее представление функции main будет иметь вид main_int_char (это для прототипа). Вы же пытаетесь обратиться к функции с внутренним представлением main_unsigned_int_char, у которой нет прототипа, отсюда и ошибка при компиляции.
Это объяснение достаточно условное, но, надеюсь, вполне понятное, чтобы увидеть разницу в работе компиляторов.
-
Folderx
- Сообщения: 296
- ОС: fedora, mandriva
Re: Целесообразность использования unsigned
(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 _тип_ одного размера
ещё есть суффиксы (с ними тоже перебор ведётся)