Сведения о вопросе

Математик

16:03, 1st July, 2020

Теги

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

Просмотров: 434   Ответов: 5

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

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

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

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



  Сведения об ответе

dumai

18:03, 1st July, 2020

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

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

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

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


  Сведения об ответе

FAriza

18:03, 1st July, 2020

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

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

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

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

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


  Сведения об ответе

dump

18:03, 1st July, 2020

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

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

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

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


  Сведения об ответе

crush

18:03, 1st July, 2020

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

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


  Сведения об ответе

ASER

18:03, 1st July, 2020

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться