キャリーフラグとオーバーフローフラグ

恥ずかしながら、電気電子系で組込み屋のくせにキャリーフラグとオーバーフローフラグについての理解があやふやでした。ちょっとまとめます。

符号なしならCF、符号つきならOF

まず第一に、キャリーフラグは符号なし加算で意味を持ち、オーバーフローフラグは符号つき加算で意味を持つ、というのがポイントです。

符号なし加算 → キャリーフラグを見る
符号つき加算 → オーバーフローフラグを見る

それぞれのフラグの定義

キャリーフラグ(CF) : MSBからの桁上がり
 CF = ( A & B ) | ( A & CY) | ( B & CY )
 where A=オペランド1のMSB, B=オペランド2のMSB, CY=MSBへの桁上がり

オーバーフローフラグ(OF) : 同符号どうしの加算結果が異符合
 OF = ( A & B & (~C) ) | ( (~A) & (~B) & C )
 where A=オペランド1のMSB, B=オペランド2のMSB, C=加算結果のMSB

8ビット整数での例

(例1)
a   = 01000000
b   = 00111111
a+b = 01111111, CF=0, OF=0

符号なしなら 64 + 63 = 127
符号つきでも 64 + 63 = 127
(例2)
a   = 01000000
b   = 01000000
a+b = 10000000, CF=0, OF=1

符号なしなら 64 + 64 = 128
符号つきなら 64 + 64 = 128 <b>オーバーフロー</b>(127を超えた)
(例3)
a   = 01000000
b   = 11000000
a+b = 00000000, CF=1, OF=0

符号なしなら 64 + 192 = 256 <b>キャリー</b>(255を超えた)
符号つきなら 64 + (-64) = 0
(例4)
a   = 10000000
b   = 10000000
a+b = 00000000, CF=1, OF=1

符号なしなら 128 + 128 = 256 <b>キャリー</b>(255を超えた)
符号つきなら (-128) + (-128) = -256 <b>オーバーフロー</b>(-128を超えた)