Когда использовать неподписанные значения над подписанными? - PullRequest
75 голосов
/ 02 августа 2008

Когда целесообразно использовать беззнаковую переменную вместо подписанной? А как насчет петли for?

Я слышал много мнений по этому поводу, и я хотел посмотреть, было ли что-то похожее на консенсус.

for (unsigned int i = 0; i < someThing.length(); i++) {  
    SomeThing var = someThing.at(i);  
    // You get the idea.  
}

Я знаю, что в Java нет беззнаковых значений, и это, должно быть, было разумное решение со стороны Sun Microsystems '.

Ответы [ 5 ]

64 голосов
/ 02 августа 2008

Я был рад найти хороший разговор на эту тему, так как раньше я об этом особо не задумывался.

Таким образом, подпись - это хороший общий выбор - даже если вы не уверены, что все числа положительны - если вы собираетесь выполнять арифметику с переменной (как в типичном случае для цикла).

Если вы собираетесь делать побитовые вещи, такие как маски, без знака начинает иметь больше смысла. Или, если вы отчаянно хотите получить этот дополнительный положительный диапазон, воспользовавшись знаковым битом.

Лично мне нравится подпись, потому что я не доверяю себе оставаться последовательным и избегать смешения двух типов (как предостерегает статья).

8 голосов
/ 02 августа 2008

В приведенном выше примере, когда «i» всегда будет положительным, а более высокий диапазон будет полезным, без знака будет полезно. Например, если вы используете операторы «объявлять», например:

#declare BIT1 (unsigned int 1)
#declare BIT32 (unsigned int reallybignumber)

Особенно, когда эти значения никогда не изменятся.

Однако, если вы ведете бухгалтерскую программу, в которой люди безответственны со своими деньгами и постоянно находятся в минусе, вам наверняка захочется использовать «подписанный».

Я согласен со святым, хотя хорошим правилом является использование подписанного, который на самом деле соответствует C, так что вы защищены.

7 голосов
/ 10 ноября 2008

Я бы подумал, что если ваш бизнес-пример требует, чтобы отрицательное число было недействительным, вы бы хотели бы, чтобы показала или выдавала ошибку.

Имея это в виду, я только недавно узнал о целых числах без знака, работая над проектом, обрабатывая данные в двоичном файле и сохраняя данные в базе данных. Я намеренно «искажал» двоичные данные и в итоге получал отрицательные значения вместо ожидаемой ошибки. Я обнаружил, что, несмотря на то, что значение преобразовано, оно не подходит для моего бизнес-случая.
В моей программе не было ошибок, и я в итоге получил неверные данные в базу данных. Было бы лучше, если бы я использовал uint и программа провалилась.

7 голосов
/ 04 августа 2008

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

Естественно, вы компилируете с предупреждениями, включенными до конца, верно?

А не рассматривали ли вы компиляцию с «обработать предупреждения как ошибки», чтобы сделать еще один шаг вперед?

Недостатком использования чисел со знаком является то, что существует соблазн перегрузить их, так что, например, значения 0-> n являются выбором меню, а -1 означает, что ничего не выбрано - вместо создания класса с двумя переменными один, чтобы указать, если что-то выбрано, и другой, чтобы сохранить, что это за выбор. Прежде чем вы это узнаете, вы проверяете отрицательный результат повсеместно, и компилятор жалуется на то, как вы хотите сравнить выбор меню с количеством вариантов выбора, которые у вас есть - но это опасно, потому что они разных типов , Так что не делай этого.

6 голосов
/ 02 августа 2008

size_t часто является хорошим выбором для этого, или size_type, если вы используете класс STL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...