Почему сдвиг вправо на целое число со знаком вызывает переполнение?

Учитывая любое 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 в десятичном виде.

Другие вопросы по тегам