オーバーフローフラグ
コンピュータープロセッサでは、 オーバーフローフラグ (Vフラグとも呼ばれる)は通常、演算で算術オーバーフローが発生したことを示すために使用されるシステムステータスレジスタの単一ビットであり、符号付き2の補数結果が数値に収まらないことを示します演算に使用されるビット(ALU幅)。一部のアーキテクチャは、オーバーフローの原因となる操作で例外を自動的に生成するように構成されている場合があります。
例示的な例は、8ビットレジスタを使用して127と127を追加するとどうなるかです。 127 + 127は254ですが、8ビット演算を使用すると、結果は1111 1110バイナリになります。これは2の補数の-2であり、したがって負になります。正のオペランドからの負の結果(またはその逆)はオーバーフローです。オーバーフローフラグが設定されると、プログラムは問題を認識し、これを軽減するか、エラーを通知できます。したがって、オーバーフローフラグは、最上位ビット(ここでは符号ビットと見なされます)が、同じ符号を持つ2つの数値を加算する(または反対符号を持つ2つの数値を減算する)ことによって変更されると設定されます。 2つの加算オペランドの符号が異なる場合(または2つの減算オペランドの符号が同じ場合)、オーバーフローは発生しません。
内部的には、オーバーフローフラグは、通常、排他的論理和へと符号ビットのうち内部キャリーによって生成されます。符号ビットは符号なしと見なされる数値の最上位ビットと同じであるため、オーバーフローフラグは「無意味」であり、符号なしの数値が加算または減算されると通常無視されます。
オーバーフローフラグは通常、比較命令(結果を保存しない減算命令と同等)を含むすべての算術演算によって変更されます。多くのプロセッサアーキテクチャでは、オーバーフローフラグはビット単位の演算(および、または、xor、not)によってクリアされます。シフトとローテーションが含まれることもありますが、これらによって未定義のままになることもあります。乗算や除算などの命令は、多くの場合、フラグを未定義のままにするか、最後の部分的な結果の影響を受けます。
多くのプロセッサ(x86だけでなく)では、加算命令と減算命令はキャリー/ボローとオーバーフローフラグの両方に影響しますが、オペランドが符号付きか符号なし数を表すかによって、通常はそのうちの1つだけが対象になります。