2の補数のビット幅と表現範囲|符号拡張・オーバーフロー
この記事の要点
- nビットの範囲は
-2ⁿ⁻¹ ~ 2ⁿ⁻¹-1です。 - 幅を広げるとき、負数は左に1、0以上は左に0を追加します。
- 同符号の加算結果だけ符号が変わればオーバーフローです。
ビット幅ごとの表現範囲
最小値 = −2n−1 / 最大値 = 2n−1−1| ビット幅 | 最小値 | 最大値 |
|---|---|---|
| 4 | -8 | 7 |
| 8 | -128 | 127 |
| 16 | -32,768 | 32,767 |
| 32 | -2,147,483,648 | 2,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に見えます。
符号付きオーバーフローの判定
同じ符号の値を足したのに結果の符号が変わると、符号付きオーバーフローです。異符号同士の加算では発生しません。
127 + 1:0111 1111 + 0000 0001 = 1000 0000(-128に見える)-128 + (-1):1000 0000 + 1111 1111 = 0111 1111(127に見える)
最上位からの桁上がりだけでは、符号付きオーバーフローを判定できません。符号なしの桁あふれと区別してください。
よくある質問
8ビットの2の補数で表せる範囲は?
-128から127までです。
符号拡張とは何ですか?
値を保ったままビット幅を広げる操作です。正数は左に0、負数は左に1を追加します。
2の補数のオーバーフローはどう判定しますか?
同符号の2数を加算した結果だけ符号が変わった場合、符号付きオーバーフローです。
ビットを切り捨てても値は同じですか?
切り捨て後の幅で元の値を表現できる場合だけ同じです。範囲外なら別の値になります。