Как отрицательные числа представляются в 32-разрядном целом числе со знаком? - PullRequest
14 голосов
/ 28 мая 2010

Как отрицательное число представляется в 32-разрядном целом числе со знаком? Это два или одно дополнение? или последний бит слева похож на флаг? Например: (-10)

Ответы [ 7 ]

17 голосов
/ 28 мая 2010

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

Для представления с двумя дополнительными символами старший значащий («крайний левый») бит называется знаковым битом , и он будет установлен для отрицательного целого числа и очищен для неотрицательного целое число. Однако это больше, чем просто «флаг». См. статью в Википедии для получения дополнительной информации.

4 голосов
/ 28 мая 2010

Из стандарта C99:

Для целых типов со знаком биты представление объекта должно быть разделены на три группы: биты значений, биты заполнения и бит знака. Там не должно быть никаких битов заполнения; там должен быть ровно один знаковый бит. каждый бит, который является значением, бит должен иметь то же значение, что и тот же бит в объектное представление соответствующий тип без знака (если есть М битов значения в типе со знаком и N в типе без знака, тогда M = N). Если знаковый бит равен нулю, он должен не влияет на итоговое значение. Если знаковый бит равен единице, значение должно быть изменяется одним из следующих способов:

- соответствующее значение со знаком бит 0 обнуляется (знак и величина);

- знаковый бит имеет значение - (2N) (два дополнения);

- знаковый бит имеет значение - (2N - 1) (дополняют).

Что из этого относится определяется реализацией, как есть значение со знаком бит 1 и все значение битов ноль (для первых двух), или со знаком бит и все биты значения 1 (для своего дополнения), это ловушка представление или нормальное значение. В случай знака и величины и дополняют, если это представление является нормальным значением, это называется отрицательным нулем.

4 голосов
/ 28 мая 2010

Обычно это два дополнения.

3 голосов
/ 30 октября 2015

Я думаю, что ответом является 0110, которому предшествует 1 повторение 28 раз, поэтому оно выглядит следующим образом:

1111 1111 1111 1111 1111 1111 1111 0110;

Шаги:

  1. битовое представление для 10:

    0000 0000 0000 0000 0000 0000 0000 1010;

  2. 0->1 и 1->0 для всех битов:

    1111 1111 1111 1111 1111 1111 1111 0101;

  3. добавить 1 к последнему биту и распространить на бит впереди, готово!

    1111 1111 1111 1111 1111 1111 1111 0110;

===

Вы можете проверить это, добавив его с 10, и вы получите 0 для всех битов. Как упомянуто выше, это основано на 2 и следует за дополнением до двух.

1 голос
/ 28 мая 2010
0xFFFFFFFF = -1
0xFFFFFFFE = -2
0xFFFFFFFD = -3
... 

и т. Д.

0 голосов
/ 02 апреля 2019

Только для справки: negation -> adding one.

Возьмем 5 в качестве примера в 8 битах, цитируемых из wiki

to convert 5 to -5: 0000 0101 - flip -> 1111 1010 - add one -> 1111 1011

Существует хитрость для преобразования числа из положительного в отрицательное или наоборот:

Добавление их, игнорируя их бит со знаком (крайний левый бит), даст вам 2^N (где N - количество бит для представления числа).

Как показано выше в 8-битном представлении, сумма 5 (0000 0101) и -5 (1111 1011) даст вам 1 0000 0000, что составляет (2 ^ 8).

0 голосов
/ 28 мая 2010

Самый старший бит (последний бит слева) устанавливается для отрицательных чисел.

...