@Yonghwa
121

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

1111 1111 = 256. (Именно так представлено число 256 в двоичной системе, на сколько я знаю)
1111 1111 = -127 (В обратом коде( two's compliment) -127 выглядит именно так, судя по википедии)
что бы 256 положить в 8 бит, что нужно сделать?
  • Вопрос задан
  • 1824 просмотра
Пригласить эксперта
Ответы на вопрос 8
saboteur_kiev
@saboteur_kiev Куратор тега Программирование
software engineer
> 1111 1111 = 256. (Именно так представлено число 256 в двоичной системе, на сколько я знаю)
> 1111 1111 = -127 (В обратом коде( two's compliment) -127 выглядит именно так, судя по википедии)

Неверно.
1111-1111 = 255

256 это:
0000-0001 0000-0000
Ответ написан
Комментировать
bingo347
@bingo347
Crazy on performance...
Старший бит обозначает знак, 0 - для нуля и положительных, 1 - для отрицательных
для смены знака нужно инвертировать двоичную запись числа и добавить к ней 1
например 127 в двоичной записи 0111 1111
инвертируем - 1000 0000 и добавим единицу - 1000 0001 - будет запись числа -127
снова инвертируем полученное число - 0111 1110, добавим единицу - 0111 1111 - снова получили 127
Ответ написан
Foolleren
@Foolleren
Компас есть, копать не люблю...
вы что-то напутали 1111 1111 это 255 в беззнаковой двоичной системе, а в знаковой это -1 (однако)
в компиляторе для этого есть типы: знаковые и беззнаковые,
беззнаковый тип берёт и тупо растёт по мере увеличения бит беззнаковый тоже только непомодулю а абсолютно и в двоичной системе
1111 1111 очевидно больше чем 1111 1110 первое это -1 а второе -2
при компиляции операция (допустим умножения) транслируется в машинный код
на ассеблере это будет выглядеть соотвесвенно так
mul EAX,EBX для беззнакового и
imul EAX,EBX для знакового типа
вот так процессор их и различает
для сложения никаких различий нет, но при выводе может случиться конфуз - когда за 127 следует -128 потом -127 потом -126
Ответ написан
Комментировать
@Mercury13
Программист на «си с крестами» и не только
Во-первых, вы ошиблись. В беззнаковом типе 1111.1111 = 255 (а не 256!), в знаковом типе 1111.1111 = −1 (а не −127).
1000.0000 — соответственно −128 и 128.
256 не передашь одним байтом — ни в знаковом типе, ни в беззнаковом.

Ну и ответ на ваш главный вопрос.
> Как ЭВМ понимает, какое число положительное, а какое отрицательное?
Если заведомо известно, что в ячейке знаковое число — как сказано выше, по верхнему биту (1 — минус, 0 — ноль или плюс). А различить знаковое и беззнаковое число — работа, вообще-то, не машины, а программиста и компилятора, и если просто дана ячейка неизвестного типа — никак не узнаешь, signed там, unsigned, дробное, указатель или символ.
• Сложение и вычитание работает одинаково для знаковых и беззнаковых чисел.
• Проверка переполнений и сравнение. Используются три флага: флаг равенства (zf, zero), флаг знакового переполнения (of, overflow) и флаг беззнакового переполнения (cf, carry). Каждая из арифметических функций заполняет и знаковые, и беззнаковые флаги, и есть отдельные функции ветвления для беззнаковых чисел (above/below — например, ja, jbe = jna…) и для знаковых (greater/less — jg, jle = jng). Jump if above, jump if below or equal, и т.д.
• Умножение и деление — также разные функции, беззнаковая mul/div и знаковая imul/idiv.

Кстати, по этой причине компилятор ругается, если нужно сравнивать signed и unsigned. Единственный способ надёжно сделать это, например, для 4-байтовых чисел — расширить до 8-байтового signed, чтобы уместился и тот, и другой.
Ответ написан
@follow39
0111 1111 - 127
1111 1111 - -127
Ответ написан
Akdmeh
@Akdmeh
PHP, Yii2, Music
0111 1111 = 127. Проверьте, пожалуйста.
Именно восьмой бит и обозначает знак. 0 - плюс, 1 - минус.
Ответ написан
@res2001
Developer, ex-admin
127 - 01111111 - прямой код, положительное число
-127 - 11111111 - обратный код
-127 - 10000001 - дополнительный код
-128 - 10000000 - дополнительный код
Если 1 бит = 1, то число отрицательное.
Читайте вики внимательней.
Ответ написан
@evgeniy_lm
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы