Если тип данных определен как тип со знаком, существуют различные типы представления - главным образом, представление величины со знаком и представление дополнения до двух.
Для представления величины со знаком, да, знаковый бит был сохранен как самый значащий бит (MSB, т.е. самый левый бит). MSB 0 представляет положительную цифру, а 1 - отрицательную. Пример:
7 = 00000111
-7 = 10000111
Это просто и (относительно) удобочитаемо для человека, однако целочисленные типы обычно не сохраняются таким образом для двух проблем:
(1) Есть два представления для нуля, +0 и -0. Сравнивать цифры затруднительно, так как это создает особый случай.
(2) Это не так легко сделать вычисления (так просто, как сложение и вычитание). Добавление двух положительных чисел, положительного числа к отрицательному номеру, отрицательного числа к положительному номеру и добавление двух отрицательных чисел - четыре разных варианта использования. например, 7+6 прямо вперед
1 Carry bit
7 = 00000111
6 = 00000110 (Logic for add)
.. ........
13 = 00001101
При вычислении 7+(- 6) подразумевается логика вычитания, которая будет использоваться вместо
7 = 00000111
-6 = 10000110 (Logic for subtraction)
.. ........
1 = 00000001
Поэтому диапазон для 8-битного числа - от (2 ^ 7)+1 до 2 ^ 7-1 (то есть от -127 до +127, с двумя нулями +0 и -0). Представление величины со знаком в основном используется для хранения чисел с плавающей точкой.
И это приводит к представлению дополнения двух. Положительные числа представлены так же, как и числа со знаком. Изменение знакового бита происходит в два этапа:(1) инвертировать все биты (изменить все 0 на 1 и 1 на 0) (2) добавить один.
Пример, чтобы получить представление -6, мы предпринимаем следующие шаги
6 = 00000110
Invert all bits: 11111001
Add one: 11111010
Итак, -6 представлен как 11111010
. С представлением дополнения до двух, вы все равно можете прочитать знак из MSB; в то время как есть только одно представление для нуля: 00000000
.
Также легко выполнить вычисления с двоичными числами в виде дополнения до двух - добавление - это добавление. Давайте еще раз посмотрим, как это работает для вычисления 7+(- 6):
1111111 Carry bit
7 = 00000111
-6 = 11111010 (Logic for add)
.. ........
1 = 00000001
Поэтому диапазон для 8-битного числа составляет от -(2 ^ 7) до 2 ^ 7-1 (то есть от -128 до +127). Обратите внимание, что диапазон отличается от представления величины со знаком.