Я изучаю C, и у меня тупой вопрос относительно «-1» в диапазоне значений для unsigned int и sign int. Я не могу найти объяснение этому нигде.
В приведенном ниже параграфе поясняется диапазон данных. Однако это не объясняет "-1". Что означает «-1»? Это -1, потому что он пропускает 0, а 0 не имеет значения?
В 32-разрядных целых числах целое число без знака имеет диапазон от 0 до 2 ^ 32 -1 = от 0 до 4 294 967 295 или около 4 миллиардов. Подписанная версия изменяется с -2 ^ 31 -1 до 2 ^ 31, что составляет от –2 147 483 648 до 2 147 483 647 или около -2 млрд до +2 млрд. Диапазон такой же, но он сдвинут на числовой линии.
Где Вы находили этот неправильный абзац? Это, кажется, о 2's дополнение, но имеет -1
в неправильном месте.
Для реализаций C с помощью поразрядного дополнения до единицы или целых чисел со знаком знака/величины, диапазон симметричен вокруг нуля (с 2 комбинациями двоичных разрядов, что и представить 0
, таким образом, положительный диапазон и отрицательный диапазон являются тем же размером).
В основном ничто никогда не использует это в эти дни, но стандарт ISO C указывает, что целые числа со знаком являются двоичными и используют или дополнение two, поразрядное дополнение до единицы или знак/величину.
<час> комбинация двоичных разрядов со всем набором битов представляет -1
, потому что sum(2^i, i=0..n-1)
один меньше чем 2^n
.
С [1 117] только [1 117] набор знакового бита, мы получаем больше-всего-отрицательное-число : -INT_MIN
подписывается переполнение (неопределенное поведение), потому что это не является представимым как int
; это требует более широкого целого числа. Или с обертыванием, -INT_MIN = INT_MIN
. Это "2's дополнительная аномалия". https://en.wikipedia.org/wiki/Two%27s_complement#Most_negative_number
можно постараться не расширяться при выполнении операции абсолютного значения: например,
unsigned abs = i >= 0 ? i : -(unsigned)i;
(Преобразование отрицательной величины к [1 111] в C имеет четко определенное поведение сокращения модуля, пока это не находится в представимом диапазоне. В C это независимо от кодирования целого числа со знаком; то, что имеет значение, значение . Так (uint8_t)-1
всегда 255. Для 2's дополняют, это просто копирует комбинацию двоичных разрядов. Для знака/величины или поразрядного дополнения до единицы реализация C должна была бы сделать некоторую математику для кастинга от со знаком до со знаком. Заметьте, что я сделал это прежде отрицание, что означает 0 - i
с обычным неподписанным обертыванием.)