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