CPU > 命令セット > Signed Overflow

サインドオーバーフロー (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 を超える時に起こる。

最終更新:2017年02月20日 18:21