Хотя обычно упоминается как «знаковый бит», двоичные значения, которые мы обычно используем, не имеют истинного знакового бита.
Большинство компьютеров используют арифметику с двумя дополнениями. Отрицательные числа создаются путем взятия одного дополнения (перевернуть все биты) и добавления одного:
5 (decimal) -> 00000101 (binary)
1's complement: 11111010
add 1: 11111011 which is 'FB' in hex
Вот почему байт со знаком содержит значения от -128 до +127 вместо от -127 до +127:
1 0 0 0 0 0 0 0 = -128
1 0 0 0 0 0 0 1 = -127
- - -
1 1 1 1 1 1 1 0 = -2
1 1 1 1 1 1 1 1 = -1
0 0 0 0 0 0 0 0 = 0
0 0 0 0 0 0 0 1 = 1
0 0 0 0 0 0 1 0 = 2
- - -
0 1 1 1 1 1 1 0 = 126
0 1 1 1 1 1 1 1 = 127
(добавить от 1 до 127 дает:)
1 0 0 0 0 0 0 0
, который мы видим в верхней части этого графика, равен -128.
Если бы у нас был правильный бит знака, диапазон значений был бы таким же (например, от -127 до +127), потому что один знак зарезервирован для знака. Если старший значащий бит является знаковым битом, мы получили бы:
5 (decimal) -> 00000101 (binary)
-5 (decimal) -> 10000101 (binary)
Интересно, что в этом случае у нас есть и ноль, и отрицательный ноль:
0 (decimal) -> 00000000 (binary)
-0 (decimal) -> 10000000 (binary)
У нас нет -0 с двумя дополнительными; то, что было бы -0, равно -128 (или, если быть более общим, на одно большее, чем наибольшее положительное значение). Мы делаем со своим дополнением, хотя; все 1 бит отрицательны 0.
Математически, -0 равно 0. Я смутно помню компьютер, где -0 <0, но сейчас я не могу найти на него никаких ссылок. </p>