Итак, если char
есть 1 byte
, то это 8 бит, верно?
Итак, 2 ^ 8 = 256, а диапазон значений char — от 0 до 255?
Как это работает со знаковыми и беззнаковыми целыми числами? Целое число занимает 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). Обратите внимание, что диапазон отличается от знакового представления величины.