サインドオーバーフロー (Signed Overflow) とは、 符号付き整数の加算/減算時に、結果が意図した符号とは 逆の符号を指す時の状態のことを指す。

CPU のレジスタのサイズが固定になっていて、 負の整数の表現に 2 の補数表現を使うために このようなことが起きる。

サインドオーバーフローの起こる条件

  • 2 つの正の整数を加算すると、結果がマイナスになる。
  • 2 つの負の整数を加算すると、結果がプラスになる。
  • 負の整数から正の整数を減算すると、結果がプラスになる。
  • 正の整数から負の整数を減算すると、結果がマイナスになる。

8 ビットの CPU で 2 つの正の整数を足してマイナスになる例

1 つ目の整数 : 0x7F (127) 2 つ目の整数 : 0x01 (1)

0x7F + 0x01 = 0x80

一見正しそうに見えるが、0x80 (2 進数で 1000 0000) は、 最上位ビットに 1 が立っているため、符号付き整数の場合は負の数となる。 よって、128 ではなく、-128 となる。 (符号無し整数の場合は 128 を表現できる。 また、符号が無いため、サインドオーバーフロー自体が起こらない)

これは、8 ビットの符号付き整数の範囲が −128 〜 127 に限られているために起こる。

16 ビット単位で符号付き整数を加算できる場合、 0x7F + 0x01 は 128 となり、サインドオーバーフローは起こらない。 16 ビットの符号付き整数の範囲は -32768 〜 32767 なので、 この場合は、結果が 32767 を超える時に起こる。


トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2013-10-27 (日) 15:52:59 (3218d)