【问题标题】:Why does a right shift on a signed integer causes an overflow?为什么有符号整数右移会导致溢出?
【发布时间】:2013-05-02 22:26:42
【问题描述】:

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

【问题讨论】:

  • 我找到了答案。如果将 0 移动到先前包含 1 的高位,这会将数字从负数变为正数。
  • @Étienne 我认为溢出是数字不适合字节大小。因此,例如,如果我使用 8 位整数乘以 120*2,这将导致溢出。如我错了请纠正我。我终于知道为什么数字会从负数变为正数(如果输入负数)但仍然无法理解负数的溢出原因(-1...-128)

标签: bit-manipulation hla


【解决方案1】:

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

-10: 1111 0110    
     ^  
     |  
   sign bit  

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

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

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

【讨论】:

  • 感谢您的回答。关于溢出原因的任何想法?
  • 您误解了一些东西,没有溢出,并且在您的情况下一切正常:/您希望得到什么结果?
  • 基本上我什么都不期待,我只是在学习位移。因此,如果设置溢出标志,则如果负数右移则变为真。我得到错误的结果吗?老实说,这对我来说真的很奇怪,因为我看不出有什么理由应该溢出。
  • 你是在微控制器上编码吗?你如何检查这个溢出标志值?
猜你喜欢
  • 2011-12-07
  • 1970-01-01
  • 2020-10-06
  • 1970-01-01
  • 2019-11-13
  • 1970-01-01
  • 2016-01-22
  • 1970-01-01
  • 2018-06-21
相关资源
最近更新 更多