FromNandの日記

自分的備忘録

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

第一オペランドをA、第二オペランドをB、計算結果をRとする。
キャリー(加算) = A + B の繰り上がり (符号なしの時の繰り上がりを検知する)
キャリー(減算) = A + (~B + 1) の繰り上がり (符号なしの時の繰り下がり無しを検知する)
オーバーフロー(加算) = (MSB(A) ^ MSB(R)) & (MSB(B) ^ MSB(R)) (符号ありの時のおかしな符号を検知する)
オーバーフロー(減算) = (MSB(A) ^ MSB(B)) & (MSB(A) ^ MSB(R)) (符号ありの時のおかしな符号を検知する)
符号なしでも符号ありでも、CPUは上記の計算を行っているだけである。
しかし、符号なしは0x00や0xffで非連続であり、符号ありは0x7fや0x80で非連続である。
この性質により、キャリーフラグは符号なし、オーバーフローは符号ありでのみ意味を持つことになる。