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

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

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

Связанный контент