コンピュータ プロセッサでは、オーバーフロー フラグ( V フラグと呼ばれることもあります) は通常、システムステータス レジスタ内の 1 ビットであり、演算中に算術オーバーフローが発生したことを示すために使用されます。これは、符号付き2 の補数の結果が、結果に使用されるビット数に収まらないことを示します。一部のアーキテクチャでは、オーバーフローが発生する演算で自動的に例外を生成するように構成できます。
たとえば、8 ビット レジスタを使用して 127 と 127 を加算するとします。127+127 は 254 ですが、8 ビット演算を使用すると、結果は 1111 1110 バイナリとなり、これは負の数 -2 の2 の補数エンコードです。正のオペランドの合計が負の場合 (またはその逆) はオーバーフローです。その場合、オーバーフロー フラグが設定され、プログラムが問題を認識してこれを緩和するか、エラーを通知することができます。オーバーフロー フラグは、最上位ビット (ここでは符号ビットと見なされます) が同じ符号の 2 つの数値を加算 (または反対の符号の 2 つの数値を減算) することによって変更されたときに設定されます。2 つの加算オペランドの符号が異なる場合 (または 2 つの減算オペランドの符号が同じ場合) は、オーバーフローは発生しません。[1]
バイナリ値が符号なし数として解釈される場合、オーバーフローフラグは意味を持たず、通常は無視されます。2の補数演算の利点の1つは、加算および減算演算で符号付きオペランドと符号なしオペランドを区別する必要がないことです。このため、ほとんどのコンピュータ命令セットは符号付きオペランドと符号なしオペランドを区別せず、すべての演算で(符号付き)オーバーフローフラグと(符号なし)キャリーフラグの両方を生成し、後続の命令が関心のある方に注意を払うようにします。[2]
内部的には、オーバーフロー フラグは通常、符号ビット への内部キャリーの排他的論理和によって生成されます。
ビット演算(AND、OR、XOR、NOT、ROTE) には符号付きオーバーフローの概念がないため、定義値はプロセッサ アーキテクチャによって異なります。プロセッサによっては、ビットを無条件にクリアするもの (ビット演算によって符号フラグが設定され、オーバーフロー フラグをクリアすると、符号フラグが有効であることが示されるため便利です) もあれば、ビットを変更しないもの、未定義の値に設定するものもあります。シフトと乗算では明確に定義された値が許可されますが、一貫して実装されているわけではありません。たとえば、x86命令セットでは、乗算と 1 ビット シフトのオーバーフロー フラグのみが定義され、複数ビット シフトでは未定義のままになります。
参考文献
- ^ Kholodov, Igor (2008 年 11 月 1 日). 「オーバーフロー検出: 符号付き数値の加算」. CIS77 コンピュータシステム入門(コースノート).ブリストル コミュニティ カレッジ. 2020 年 12 月 30 日閲覧。
- ^ Allen, Ian D. (2011 年 2 月 25 日)。「バイナリ演算における CARRY フラグと OVERFLOW フラグ」。DAT 2343 コンピュータ システム アーキテクチャ(コース ノート)。Algonquin College。
