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

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

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

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

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

Ответ 1

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

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

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

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

Ответ 2

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

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

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

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

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

Ответ 3

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

Ответ 4

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

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

И считаете ли вы, что компилировать с помощью "рассматривать предупреждения как ошибки", чтобы сделать это еще на один шаг?

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

Ответ 5

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

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