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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Передавать по ссылке или передавать по значению?
  • Что такое функция батута?
  • Когда это делать?
  • Давайте будем гением компьютера.