Что означает «-1» в диапазоне значений для unsigned int и sign int?

Я изучаю 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 млрд. Диапазон такой же, но он сдвинут на числовой линии.

24
задан Boann 29 August 2019 в 12:14
поделиться

1 ответ

Где Вы находили этот неправильный абзац? Это, кажется, о 2's дополнение, но имеет -1 в неправильном месте.

Для реализаций C с помощью поразрядного дополнения до единицы или целых чисел со знаком знака/величины, диапазон симметричен вокруг нуля (с 2 комбинациями двоичных разрядов, что и представить 0, таким образом, положительный диапазон и отрицательный диапазон являются тем же размером).

В основном ничто никогда не использует это в эти дни, но стандарт ISO C указывает, что целые числа со знаком являются двоичными и используют или дополнение two, поразрядное дополнение до единицы или знак/величину.

<час>

В [1 114] 2's дополнение (почти универсальный в эти дни), диапазон представимых значений с помощью n биты является [-2 <глоток> n-1 , 2 <глоток> n-1 - 1]. Одна комбинация двоичных разрядов (весь нуль битов) представляет нуль значения. Каждый бит имеет значение места 2^i, кроме заключительного, которое имеет значение места -2^(n-1).

комбинация двоичных разрядов со всем набором битов представляет -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 с обычным неподписанным обертыванием.)

2
ответ дан 28 November 2019 в 17:57
поделиться