int
и unsigned int
- два разных целочисленных типа.(int
может также упоминаться как signed int
, или просто signed
; unsigned int
также может упоминаться как unsigned
.)
Как следует из названия, int
является знаковый целочисленный тип, а unsigned int
- целое число без знака .Это означает, что int
может представлять отрицательные значения, а unsigned int
может представлять только неотрицательные значения.
Язык C предъявляет некоторые требования к диапазонам этих типов.Диапазон int
должен быть не менее -32767
.. +32767
, а диапазон unsigned int
должен быть не менее 0
.. 65535
.Это подразумевает, что оба типа должны быть не менее 16 бит.Они 32-битные во многих системах или даже 64-битные в некоторых.int
обычно имеет дополнительное отрицательное значение из-за представления двойного дополнения, используемого большинством современных систем.
Возможно, наиболее важным отличием является поведение арифметики со знаком и без знака.Для подписанного int
переполнение имеет неопределенное поведение.Для unsigned int
переполнения нет;любая операция, которая возвращает значение вне диапазона типа, оборачивается, например, UINT_MAX + 1U == 0U
.
Любой целочисленный тип, со знаком или без знака, моделирует поддиапазон бесконечного набора математических целых чисел.Пока вы работаете со значениями в диапазоне типа, все работает.Когда вы приближаетесь к нижней или верхней границе типа, вы сталкиваетесь с разрывом и можете получить неожиданные результаты.Для целочисленных типов со знаком проблемы возникают только для очень больших отрицательных и положительных значений, превышающих INT_MIN
и INT_MAX
.Для целочисленных типов без знака проблемы возникают при очень больших положительных значениях и при нуле .Это может быть источником ошибок.Например, это бесконечный цикл:
for (unsigned int i = 10; i >= 0; i --) [
printf("%u\n", i);
}
, потому что i
всегда равен больше или равно нулю;это природа неподписанных типов.(Внутри цикла, когда i
равен нулю, i--
устанавливает его значение на UINT_MAX
.)