恥ずかしながら、電気電子系で組込み屋のくせにキャリーフラグとオーバーフローフラグについての理解があやふやでした。ちょっとまとめます。
符号なしなら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を超えた)