2013-05-02 205 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

相關問題