Так что если char равен 1 byte значит, это 8 бит, верно?

Таким образом, 2 ^ 8 = 256 и от 0 до 255 - это диапазон char?

Как это работает с подписанными и неподписанными int? Значение int составляет 4 байта, поэтому 32 бита, поэтому 2 ^ 32 . 2 ^ 31 - 1 дает положительный диапазон чисел со знаком, так что происходит с 32-м битом? Это используется для знака? Как знак будет храниться в памяти?

1 ответ1

0

Если тип данных определен как тип со знаком, существуют различные типы представления - главным образом, представление величины со знаком и представление дополнения до двух.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .