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

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

6 ответов

Решение

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

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

Я думаю, что ответ 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 и следует за дополнением до двух.

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

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

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

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

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

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

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

0xFFFFFFFF = -1
0xFFFFFFFE = -2
0xFFFFFFFD = -3
... 

& скоро

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

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

Взять 5как пример в 8 битах, цитата из вики

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).

Другие вопросы по тегам