Как отрицательные числа представляются в 32-разрядном целом числе со знаком?
Как отрицательное число представляется в 32-разрядном целом числе со знаком? Это два или одно дополнение? или последний бит слева похож на флаг? Например: (-10)
6 ответов
Большинство компьютеров в наши дни используют два дополнения для целых чисел со знаком, но они могут различаться в зависимости от аппаратной архитектуры, языка программирования или других проблем, связанных с платформой.
Для представления с двумя дополнительными символами наиболее значимый ("крайний левый") бит называется знаковым битом, и он будет установлен для отрицательного целого числа и очищен для неотрицательного целого числа. Однако это больше, чем просто "флаг". Смотрите статью в Википедии для получения дополнительной информации.
Я думаю, что ответ 0110
, перед которым 1 повторяется 28 раз, поэтому это выглядит так:
1111 1111 1111 1111 1111 1111 1111 0110;
шаги:
Битовое представление для 10:
0000 0000 0000 0000 0000 0000 0000 1010;
0->1
а также1->0
для всех битов:1111 1111 1111 1111 1111 1111 1111 0101;
добавьте 1 к последнему биту и распространяйте к биту вперед, готово!
1111 1111 1111 1111 1111 1111 1111 0110;
===
Вы можете проверить, добавив его с 10, и вы получите 0 для всех битов. Как упомянуто выше, это основано на 2 и следует за дополнением до двух.
Из стандарта C99:
Для целых типов со знаком биты представления объекта должны быть разделены на три группы: биты значения, биты заполнения и бит знака. Там не должно быть никаких битов заполнения; должен быть ровно один знаковый бит. Каждый бит, который является битом значения, должен иметь то же значение, что и тот же бит в представлении объекта соответствующего типа без знака (если имеется M битов значения в типе со знаком и N в типе без знака, то M = N). Если бит знака равен нулю, он не должен влиять на результирующее значение. Если бит знака равен единице, значение должно быть изменено одним из следующих способов:
- соответствующее значение со знаковым битом 0 обнуляется (знак и величина);
- знаковый бит имеет значение -(2N) (дополнение до двух);
- знаковый бит имеет значение -(2N - 1) (дополнение).
Что из этого применимо, определяется реализацией, так как является ли значение с битом знака 1 и всеми битами значения ноль (для первых двух), или с битом знака и всеми битами значения 1 (для дополнения единиц), является представлением ловушки или нормальное значение. В случае знака, величины и их дополнения, если это представление является нормальным значением, оно называется отрицательным нулем.
Самый старший бит (последний бит слева) устанавливается для отрицательных чисел.
Просто для справки: 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).