1

给定任何 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; 
4

1 回答 1

2

带符号的数字用二进制的 2 的补码表示,加上“左侧”的符号位。在 7 位上编码的 10 的 2 的补码是 1110110,负数的符号位值为 1。

-10: 1111 0110    
     ^  
     |  
   sign bit  

然后你把它移到右边(当你右移零被添加到左边时):

-10 >> 1: 0111 1001  
          ^  
          |  
        sign bit 

您的符号位值 0(正),而 1111011 是十进制的 123。

于 2013-05-02T11:41:09.097 回答