Недавно я читал о дополнении до двух и заметил, что при работе с целыми числами без знака, очень близкими к пределу (в основном числами, достаточно большими, чтобы MSB был равен 1), вычитание, похоже, все еще работает, даже когда бит со знаком все еще должен быть заполнен фактическим информация о номере. Например, возьмите 254 и 252, представленные как 0b11111110
и 0b11111100
в 8-битном формате соответственно. Вычитание потребует дополнения 2 до 252, так что 0b11111110 + 0b00000100
дает правильный результат 0b00000010 = 2
. Почему именно это работает так, как задумано?
PS: Я также заметил, что если бы я взял беззнаковые числа и посмотрел на них, как если бы они были в форме дополнения до двух, я бы получил -2 и -4, которые вычитаются до 2. Может быть, это следствие того, как система была создана и в конечном итоге использовалась при проектировании?
0b11111110 - 0b00000100 = 0b00000010
? Ооо, вы говорите, -252 это то же самое, что + (- 252). Думаю, у вас тогда опечатка. То, что меня смутило, должно быть + не - в вашем посте. - person JohnFilleau   schedule 06.03.2021N
будет (256 - N
). И если 8-битное сложение и вычитание производится по модулю 256, то этоN1 - N2 = (N1 - N2)%256
. Если вы замените вычитание N2 сложением его двойного дополнения, вы получите(N1 - N2) = (N1 + (256 - N2))%256
. Операция по модулю является распределительной и256%256 = 0
, поэтому вы обнаружите, что для любых значений N1 и N2 добавление двух дополнений к N2 эквивалентно вычитанию N2. - person JohnFilleau   schedule 06.03.2021