Почему в кодировке число всегда меньше на 1?
Например: 32-разрядные (4-байтовые) целые числа со знаком в диапазоне от -2 147 483 648 до 2 147 483 647. А должно получиться 2 147 483 648. Да даже Двоичное 8-ми разрядное число со знаком в дополнительном коде может представлять любое целое в диапазоне от −128 до +127. Почему не до +128? Объясните, пожалуйста, простым языком. Спасибо.
Ответы (2 шт):
Все дело в 0
Диапазон 1 байтного (8 битного) числа может содержать в себе 2^8, то есть 256 цифр. И поскольку 256 четное число то разделяя на 2 группы (положительные и отрицательные) получаем 128 цифр в каждом. Но с -128 до +128 содержит не 256 а 257 чисел, так как внедряет в себе ещё 0. Поэтому создатели ЯП решили чтобы было от -128 до 127. Они так же могли бы поставить от -127 до 128, но от -128 до 128 никак!
Дело в том что знак кодируется старшим битом. Если 0, то это положительное число, если 1 - то отрицательное. И при этом отрицательные числа задаются в "инверсии". Если рассматривать случай с 8 битами, то
00000001 это +1 - т.е. первый ноль говорит о том что это положительное число. А дальше семь битов задают само число. А с помощью 7 битов можно задать самое большое число - это 127. Т.е. почему верхняя граница +127 прояснилось.
С отрицательными числами чуть по другому.
11111111 это -1 - первая единичка это признак знака. А вот дальше само число. Почему так, а не 10000001? Для упрощения арифметики.
Компьютер оперирует двоичными числами. И 11111111+00000001 даст 0. Потому что перенос разряда пройдет до самого конца и в байте окажется 0. Т.е. с точки зрения процессора просто происходит операция с обычнуми числами. Процессор про знак ничего не знает.
И в таком варианте получается, что самое большое (по модулю) отрицательное число это 10000000 т.е. -128