2013-04-24 4 views
9

Часто известны значения положительных значений. Например, порядковый номер TCP/UDP всегда имеет положительное значение. Оба int и unsigned int достаточно велики, чтобы хранить даже самые большие sequence number, поэтому я могу использовать любой из этих типов. Есть много других примеров, когда значения известны как положительные.Должен ли я использовать «unsigned» каждый раз, когда знаю, что обрабатываю значения без знака?

Есть ли причины использовать unsigned тип, если достаточного количества обычного signed типа достаточно (и часто более чем достаточно)?

Лично я предпочитаю использовать обычные типы, потому что:

  • int, вероятно, немного более читаемым, чем uint или unsigned int
  • мне не нужно включать дополнительные заголовки для UINT и т.д.
  • Я буду избегать дополнительных бросков где-то еще в программе

Причины использования unsigned Тип, который я могу себе представить:

  • help компилятор сгенерированный более качественный код?
  • помощь другой программист, чтобы понять, что переменная не имеет знака
  • избежать возможных ошибок (например, когда INT присваивается UINT компилятор, вероятно, будет генерировать ошибку во время компиляции, и мы должны проверить, что значение мы задаём не является отрицательным)
+0

Некоторые мысли об этом здесь: http://embeddedgurus.com/stack-overflow/2009/08/a-tutorial-on- signed-and-unsigned-integers/ – Morwenn

+1

спасибо, также я нашел этот вопрос только сейчас http://stackoverflow.com/questions/12225521/should-unsigned-ints-be-used-if-not-necessary?rq= 1 – javapowered

+1

Нет. Есть несколько аргументов против использования 'unsigned' - Stroustrup ссылается на это при передаче в языке программирования C++ где-то - Лакос ушел и написал главу об этом в одной из своих книг: утомительный. Примеры проблем: если у вас есть значения a и b, 'abs (a - b)' имеет тенденцию работать интуитивно для int, но не без знака; и стоит обратить внимание на то, что стандартные конверсии могут звучать бесшумно, поэтому те проверки, которые вы можете надеяться получить от использования unsigned, в любом случае не работают - отрицательные значения становятся бесшумными и наоборот. –

ответ

1

Одна из причин заключается в том, что сравнение числа с подписью и без знака может привести к неожиданным результатам. В C и (я думаю) C++ сравнение числа с подписью и без знака приводит к тому, что подписанный номер интерпретируется как unsigned. Если подписанное значение оказывается отрицательным, чтение его как unsigned приведет к значению LARGER, чем любое беззнаковое число, которое вам не подходит. См. this question для примера в Objective-C, который использует те же правила преобразования, что и C.

 Смежные вопросы

  • Нет связанных вопросов^_^