Когда использовать неподписанные значения над подписанными них?

голоса
66

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

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

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

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

Задан 02/08/2008 в 04:34
источник пользователем
На других языках...                            


5 ответов

голоса
61

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

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

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

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

Ответил 02/08/2008 в 04:49
источник пользователем

голоса
8

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

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

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

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

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

Ответил 02/08/2008 в 05:31
источник пользователем

голоса
6

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

Ответил 02/08/2008 в 06:51
источник пользователем

голоса
7

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

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

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

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

Ответил 04/08/2008 в 14:35
источник пользователем

голоса
7

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

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

Ответил 10/11/2008 в 20:04
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more