C ++ использует беззнаковые значения, потому что им нужен полный диапазон. В 32-битной системе язык должен позволять иметь вектор размером 4 ГБ, а не только 2 ГБ. (ОС может не позволять использовать все 4 ГБ, но сам язык не хочет мешать вам)
В .NET целые числа без знака несовместимы с CLS. Вы можете использовать их (на некоторых языках .NET), но это ограничивает переносимость и совместимость. Таким образом, для библиотеки базовых классов используются только целые числа со знаком.
Однако это оба крайних случая. Для большинства целей подписанный int
достаточно большой. Итак, если оба предлагают нужный вам диапазон, вы можете использовать оба.
Одно из преимуществ, которые иногда имеют целые числа со знаком, состоит в том, что они упрощают обнаружение потери значимости. Предположим, вы вычисляете индекс массива и из-за некорректного ввода или, возможно, логической ошибки в вашей программе вы пытаетесь получить доступ к индексу -1
.
С целым числом со знаком это легко обнаружить. С беззнаковым значением он будет обернутся и станет UINT_MAX
. Это значительно затрудняет обнаружение ошибки, поскольку вы ожидали положительного числа, а вы получили положительное число.
Так что действительно, это зависит от обстоятельств. C ++ использует unsigned, потому что ему нужен диапазон. .NET использует подписанный, потому что он должен работать с языками, у которых нет без знака.
В большинстве случаев работают оба, а иногда подписание может позволить вашему коду более надежно обнаруживать ошибки.
person
jalf
schedule
06.04.2012