Почему сдвиг вправо на целое число со знаком вызывает переполнение?
Учитывая любое 8-битное отрицательное целое число (подписанное так между -1 и -128), сдвиг вправо в HLA вызывает переполнение, и я не понимаю, почему. Если смещено один раз, оно должно делить значение на 2. Это верно для положительных чисел, но, очевидно, не для отрицательных. Зачем? Так, например, если введено -10, результат будет +123.
Program cpy;
#include ("stdlib.hhf")
#include ("hla.hhf")
static
i:int8;
begin cpy;
stdout.put("Enter value to divide by 2: ");
stdin.geti8();
mov(al,i);
shr(1,i); //shift bits one position right
if(@o)then // if overlow
stdout.put("overflow");
endif;
end cpy;
1 ответ
Числа со знаком представлены с их двоичным дополнением в двоичном формате плюс бит знака "слева". Дополнение 2 к 10, закодированное на 7 битах, составляет 1110110, а значение знакового бита для отрицательных чисел равно 1.
-10: 1111 0110
^
|
sign bit
Затем вы сдвигаете его вправо (когда вы сдвигаете вправо, нули добавляются влево):
-10 >> 1: 0111 1001
^
|
sign bit
Ваш знаковый бит стоит 0 (положительный), а 1111011 - 123 в десятичном виде.