Диапазон типов данных со знаком и без знака
Так что если char
является 1 byte
следовательно, это 8 бит, верно?
Таким образом, 2 ^ 8 = 256 и от 0 до 255 - это диапазон char?
Как это работает с подписанными и неподписанными int? Значение int составляет 4 байта, поэтому 32 бита, так 2 ^ 32
, 2 ^ 31 - 1 дает положительный диапазон целых чисел со знаком, так что происходит с 32-м битом? Это используется для знака? Как знак будет храниться в памяти?
1 ответ
Если тип данных определен как тип со знаком, существуют различные типы представления - в основном, представление со знаком и величина с дополнением до двух.
Для представления величины со знаком, да, знаковый бит был сохранен как самый старший бит (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). Обратите внимание, что диапазон отличается от представления величины со знаком.