ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
22 июля
1162009 Топик полностью
RxTx (07.01.2022 19:48, просмотров: 154) ответил BlackMorda на В обозначении "младшего разряда". Байт или бит? ;-)
Похоже, ты говорил не о том чтобы сменить знак, а предполагаешь что существует некий перевод числа в дополнительный код? Современные микропроцессоры, точнее их АЛУ манипулируют битами таким образом что это соответствует способу представления чисел "дополнительный код", он же "дополнение двоек", two's complement. Т.е. не требуется действий, любое число (любой архитектурный набор бит, 8,16,32,64) в регистре и так будет интерпретироваться процессором как будто оно в 

"дополнительном коде" (two's complemet). А те операции, что ты продемонстрировал выше на самом деле являются операциями смены знака. Выше можно было написать просто return -a; это то же самое. Я именно так изначально это и понял и чуть дополнил написанное.


> В обозначении "младшего разряда". Байт или бит? ;-)


В моём контексте выше - я подозревал что у тебя речь идет о битах. И я говорю о битах. Ок, далее просто уточню проговорив до полного понимания как меняется знак. Знак у чисел (т.е. группа бит, типично набор 8,16,32,64 бит но может быть любое количество) в дополнительном коде можно изменять так: сначала биты инвертируются. (Это можно выполнить как особой инструкцией процессора, так и выполнив XOR с набором бит которые все установлены в 1, т.к. это эквивалентно, либо как-то еще). Затем весь набор бит (не отдельный байт, не часть) необходимо беззнаково инкрементировать (или что то же самое, беззнаково добавить единицу). При этом должно быть предусмотрен заворот бит, т.е. 255 превратится в 0, 65535 превратится в 0 итд. На тех архитектурах где есть вычитание, операцию инверсии и инкремента можно заменить на вычитание из нуля. Результирующим набором бит будет такой, который если интерпретировать как "число со знаком в дополнительном коде" у него изменится знак. Примеры над байтом (октет 8 бит):


Было              Инверсия бит          Результат после INC        Комментарий


0000 0000    →    1111 1111    →     0000 0000                     У нуля знак не изменяется, ноль остается нулем

0000 0001    →    1111 1110    →     1111 1111                     1 стала 255 т.е. -1

0000 0010 → 1111 1101 → 1111 1110 2 стала 254 или -2

1010 1010 → 0101 0101 → 1010110.b -86 (170) стало после инверсии бит 85, а затем 86
Спасибо, князь. Вы настоящий дворянин. И программист.