2013-05-02 60 views
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; 
+0

我找到了答案。如果0移到先前包含1的高位,这会将数字从负变为正。 – 2013-05-02 11:28:23

+0

@Étienne我认为溢出是数字不适合字节大小。所以例如,如果我乘以120 * 2使用8位整数这将导致溢出。如我错了请纠正我。我终于知道为什么数字会从负数变为正数(如果输入的是负数),但仍然无法理解负数的溢出原因(-1 ...- 128) – 2013-05-02 11:40:24

回答

2

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

-10: 1111 0110  
    ^ 
    | 
    sign bit 

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

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

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

+0

感谢您的回答。有关溢出的想法是什么原因? – 2013-05-02 11:46:30

+1

你误解了一些东西,没有溢出,一切都按照预期在你的情况下工作:/你期望结果如何? – 2013-05-02 11:48:14

+0

基本上我不期待任何事情,即时通讯只是学习位移。所以如果设置溢出标志,它变为真,如果负数向右移。我得到错误的结果?老实说,对我来说真的很奇怪,因为我看不出有什么理由为什么会出现溢出。 – 2013-05-02 11:54:20

相关问题