2の補数のビット幅と表現範囲|符号拡張・オーバーフロー

この記事の要点

ビット幅ごとの結果を比較する

同じ値を8・16・32ビットなどへ切り替えて確認できます。

2の補数変換ツールを使う

ビット幅ごとの表現範囲

最小値 = −2n−1 / 最大値 = 2n−1−1
ビット幅最小値最大値
4-87
8-128127
16-32,76832,767
32-2,147,483,6482,147,483,647

負数側が1つ多い理由

nビットには2ⁿ個のパターンがあります。最上位が0の半分には0も含まれるため、正数は1つ少なくなります。8ビットでは0〜127が128個、-128〜-1が128個です。

最小値の符号反転に注意

8ビットの-128に対応する+128は範囲外です。そのまま8ビットで符号反転すると-128のままになります。

符号拡張で幅を広げる

値を保って幅を広げるには、最上位ビットを左へ複製します。正数は0、負数は1で埋めます。

42:0010 1010 → 0000 0000 0010 1010
-42:1101 0110 → 1111 1111 1101 0110

負数を0で埋めると、-42ではなく正の値として解釈されます。

幅を狭めるときの切り捨て

上位ビットを捨てても値が保たれるのは、切り捨て後の範囲に元の値が入る場合だけです。16ビットの100を8ビットにしても100ですが、200は8ビット符号付きの範囲外で1100 1000、つまり-56に見えます。

符号付きオーバーフローの判定

同じ符号の値を足したのに結果の符号が変わると、符号付きオーバーフローです。異符号同士の加算では発生しません。

  1. 127 + 10111 1111 + 0000 0001 = 1000 0000(-128に見える)
  2. -128 + (-1)1000 0000 + 1111 1111 = 0111 1111(127に見える)

最上位からの桁上がりだけでは、符号付きオーバーフローを判定できません。符号なしの桁あふれと区別してください。

よくある質問

8ビットの2の補数で表せる範囲は?

-128から127までです。

符号拡張とは何ですか?

値を保ったままビット幅を広げる操作です。正数は左に0、負数は左に1を追加します。

2の補数のオーバーフローはどう判定しますか?

同符号の2数を加算した結果だけ符号が変わった場合、符号付きオーバーフローです。

ビットを切り捨てても値は同じですか?

切り捨て後の幅で元の値を表現できる場合だけ同じです。範囲外なら別の値になります。