two’s complement overflow detection

two’s complement overflow有兩種情況會發生

  • carry in without carry out
  • carry out without carry in

用8 bit signed int為例

-100 + (-30)
    1001 1100
+   1110 0010
------------
  1 0000 0000 <- carry bit
  C S
= 1 0111 1110 

C的位置是carry out(就是我們一般說的carry), S的位置是carry in(就是我們一般說的sign bit)

上面的值是 -130 但是 8bit最小是-128,顯然是overflow

根據上面的規則 屬於 carry out without carry in

再看一個例子

100 + 30
    0110 0100
+   0001 1110
----------------------
  0 1111 1000  <- carry bit
  C S
= 0 1000 0010 

根據上面的規則 屬於 carry in without carry out -> overflow

那要怎麼理解上面的規則呢

這要從overflow可能發生的點看

overflow只有可能發生在

  • 正 + 正 => 負
  • 負 + 負 => 正

有沒有可能 正 + 正 => 正 還是overflow?

這邊可以用一個圓盤來想,將圓盤分成兩半,藍色區為正(包含0),紅色區為負

8bit的signed int 是一個循環的圓盤,加法網順時鐘走,減法往逆時鐘走,加法最多(順時鐘)走127步,減法最多(逆時鐘)走128步,因此127 + 127 最多還是負的 (藍色星星標記的地方),-128 + (-128) = 0最多還是正的區域(非負),因此不會有 正+正=正(overflow) or 負+負 = 負(overflow)的情況發生

最後考慮 正 + 正 = 負 & 負 + 負 = 正

正 +  正
  0xxx 
+ 0xxx
-------
  1xxx <-負
負代表 sign bit = 1,因為 兩個數的sign bit都是0(正),
所以代表有carry in,而carry bit(carry out)也會是0,
因為前一位bit只會有 0 + 0 + 1這種case

負 + 負
  1xxx
+ 1xxx
-------
  0xxx <-正
兩個sign bit = 1要加成變成0 代表
 1 + 1 + (0 carry in) = 10, 有carry out 1

上面也就解釋了兩個overflow detection的規則了

This entry was posted in C Language. Bookmark the permalink.

Leave a Reply