Как хранятся отрицательные значения со знаком?

13

Я смотрел это видео о максимальных и минимальных значениях целых чисел со знаком.

Возьмите пример положительного значения со знаком - 0000 0001 Первый бит означает, что число положительное, а последние 7 бит - это само число. Так что это легко интерпретируется как +1.

Теперь возьмем пример отрицательного значения со знаком - 1000 0000, которое равно -8. Хорошо, компьютер может понять, что это отрицательное значение из-за первого бита, но как, черт возьми, он понимает, что 000 0000 означает -8?

В общем, как отрицательные значения со знаком хранятся / интерпретируются на компьютере?

discussedtree
источник
nl.wikipedia.org/wiki/Two%27s_complement - это то, как двоичные числа хранятся на компьютерах.
Питер Б
@PieterB Может быть, ваш компьютер. И много других людей. По веским причинам! Но не думайте, что это единственный способ.
underscore_d
Любым способом, который вам нравится. Я могу вспомнить хотя бы 256! способы хранения (8 бит) двоичных чисел на компьютерах. Однако большинство из них невероятно глупы.
Caleth
C не указывает, это в основном то, как производитель чипов решает представлять данные. C компилируется в машинный код, и он старается не переопределять, как чип хранит числа. Те же правила применяются к числам с плавающей запятой. Изготовитель чипов должен определить, как они хранятся. Большинство производителей чипов используют 2 дополнения, но я уверен, что есть исключения.
Берин Лорич

Ответы:

29

Стандарт C не предусматривает какой-либо конкретный способ представления отрицательных чисел со знаком.

В большинстве реализаций, с которыми вы можете столкнуться, целые числа со знаком минус хранятся в том, что называется дополнением к двум . Другой основной способ хранения отрицательных чисел со знаком называется дополнением .

Дополнение к двоичному числу N xопределяется как 2^N - x. Например, дополнение к 8-битной кодировке 1- 2^8 - 1или 1111 1111. Два дополнения 8-битного 8есть 2^8 - 8, что в двоичном виде 1111 1000. Это также можно рассчитать, перевернув биты xи добавив единицу. Например:

 1      = 0000 0001
~1      = 1111 1110
~1 + 1  = 1111 1111
-1      = 1111 1111

 21     = 0001 0101
~21     = 1110 1010
~21 + 1 = 1110 1011
-21     = 1110 1011

Дополнение к N-битному числу x определяется как x со всеми его битами, в основном.

 1      = 0000 0001
-1      = 1111 1110

 21     = 0001 0101
-21     = 1110 1010

Дополнение двух имеет несколько преимуществ перед дополнением. Например, у него нет понятия «отрицательный ноль», что по понятным причинам сбивает с толку многих людей. Сложение, умножение и вычитание работают так же с целыми числами со знаком, реализованными с двумя дополненными, как и с целыми числами без знака.

Майлз Рут
источник
19

Существует три хорошо известных метода представления отрицательных значений в двоичном виде:

  1. Подписанная величина . Это проще всего понять, потому что он работает так же, как мы привыкли иметь дело с отрицательными десятичными значениями: первая позиция (бит) представляет знак (0 для положительного, 1 для отрицательного), а другие биты представляют число , Хотя нам легко это понять, с компьютерами трудно работать, особенно при выполнении арифметических операций с отрицательными числами.
    В 8-битной величине со знаком значение 8 представляется как 0 0001000, а -8 как 1 0001000.

  2. Свое дополнение . В этом представлении отрицательные числа создаются из соответствующего положительного числа путем переключения всех битов, а не только знака бита. Это облегчает работу с отрицательными числами для компьютера, но усложняет существование двух различных представлений для +0 и -0. Отражение всех битов делает это труднее понять людям.
    В дополнение к 8-битному значению 8 представлено как 00001000, а -8 как 11110111.

  3. Два дополнения . Это наиболее распространенное представление, используемое в настоящее время для отрицательных целых чисел, потому что с ним проще всего работать для компьютеров, но также труднее для понимания людьми. При сравнении битовых комбинаций, используемых для отрицательных значений между одним дополнением и дополнением двух, можно заметить, что один и тот же битовый шаблон в дополнении двух кодирует следующий младший номер. Например, 11111111 означает -0 в дополнении к одному и -1 в дополнении к двум, а также 10000000 (-127 против -128).
    В дополнении 8-битового два значение 8 представлено как 00001000, а -8 как 11111000.

Барт ван Инген Шенау
источник
8
Величина со знаком также имеет два нуля.
Йорг Миттаг
+1 за упоминание знака / величины. необычно и неудобно (для процессоров, если не для людей!), но стоит знать.
underscore_d
Почти все мы работаем со звездной величиной, особенно с числами FP.
Paulo1205,
2

Подписанные целые числа хранятся с использованием http://en.wikipedia.org/wiki/Two%27s%20complement

Тогда вы получите:

000   0
001   1
010   2
011   3
100   -4
101   -3
110   -2
111   -1

По сути, это очень легко считать, вы считаете до половины от целого числа со знаком. Сделайте +1, сделайте его отрицательным и начните обратный отсчет.

Питер Б
источник