Диапазон типов данных со знаком и без знака

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

Другие вопросы по тегам