ホームページ  >  記事  >  バックエンド開発  >  2 進数システム - C/C++ での算術加算オーバーフロー?

2 進数システム - C/C++ での算術加算オーバーフロー?

PHPz
PHPz転載
2023-08-26 22:33:011026ブラウズ

2 の補数システムはコンピュータ アーキテクチャで広く使用されています。

N ビット 2 の補数システムは、-2n-1 から 2n-1-1 までの数値を表現できます。

4 ビットは、(-8 から 7) までの数値を表現できます。

5 ビットは、2 の補数系で (-16 ~ 15) の数値を表現できます。

オーバーフローは、2 つの N ビット 2 の補数が追加され、答えが大きすぎてその N ビット グループに収まらない場合にも発生します。

コンピュータには N ビットの固定レジスタが含まれています。 2 つの N 桁の数を加算した結果が、最大の N 桁の 1 桁の数になります。

キャリー フラグは追加ビットを格納します。ただし、キャリーは必ずしもオーバーフローを示すわけではありません。

オーバーフロー検出

場合-

  • 2 つの負の数を加算した結果が正の数、または

  • 2 つの負の数を加算した結果は負の数になります。

したがって、両方のオペランドと結果の最上位ビット (MSB) を検証することで、オーバーフローを検出できます。ただし、3 ビット コンパレータを実装する代わりに、桁上げと MSB からの桁上げ出力を検証することでオーバーフローを検出できます。 2 の補数の N ビット加算を考えます。

二进制数系统 - C/C++中的算术加法溢出?

#オーバーフローは、キャリー入力がキャリー出力と等しくない場合に発生します。上記のオーバーフロー式は、次の分析から議論できます。

二进制数系统 - C/C++中的算术加法溢出?

#最初の図では、2 つの数値の最上位ビットは 0 であり、それらが正の数値であることを示しています。ここで、キャリー入力が 1 の場合、結果の最上位ビットは 1 になり、結果が負 (オーバーフロー) であることを示し、キャリー出力は 0 になります。キャリーインとキャリーアウトは等しくないため、オーバーフローが発生します。

2 番目の図では、2 つの数値の最上位ビットは 1 であり、負の数値であることを示しています。ここで、キャリー入力が 0 の場合、結果の最上位ビットは 0 になり、結果が正 (オーバーフロー) であることを示し、キャリー出力は 1 になります。キャリーインとキャリーアウトは等しくないため、オーバーフローが発生します。

したがって、MSB のキャリーインとキャリーアウトはオーバーフローを検出するのに十分です。

二进制数系统 - C/C++中的算术加法溢出?

#上記の XOR ゲートは、オーバーフローの検出に使用できます。

以上が2 進数システム - C/C++ での算術加算オーバーフロー?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はtutorialspoint.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。