今回はビット範囲の問題で2進数補数による負の表現の理解が進む内容になっています。
問題
解き方
公式を暗記する方法
n桁の2進数(2の補数表現を使用)で表せる数値の範囲は、−2^(n−1)から2^(n−1)−1
となります。これ暗記している方も多いと思いますが、せっかくなので理屈を確認しながら見ていきます。理屈がわかると公式を忘れても自分で作ることができるようにもなりますよ。
負数を2の補数で8ビットで表す
8ビットで負数を2の補数で表す場合、最上位ビット(MSB|Most Significant Bit)が符号ビットの役割を担います。つまり一番左のビットが0なら正の数、1なら負の数という具合です。
ということは数を表すのは実質7ビットになるわけですね。
正の最も大きい数を確認
前述の実質7ビットで表現することを踏まえて正の数の最も大きい数を考えてみると以下のようになると思います。
01111111
これは単純に2を7乗すれば計算できますね。127になります。
負の最も小さい数を確認
こちらも最上位ビットを符号ビットとして考えると以下になると思います。
10000000
これは-128になります。???になる方も多いと思いますがではなぜこれが-128になるのでしょうか?一緒に確認してみましょう。
2の補数で負の数を表現する
2の補数で負の数を表現することを確認してみます。以下の手順で負の数を表現します。
正の数のビットを反転します。その解に1をプラスします。これで正の数が負の数に変わります。(詳細は負の2進数を2の補数で表現するなどのキーワードで調査してみてください)
では実際に前述の127でやってみましょう。
01111111→10000000+1→10000001
10000001=−127ということがわかりました。
2の補数での負の数から絶対値を逆算
2の補数を使った負の数から絶対値(符号を除いた数値部分)を逆算してみます。要は前述の1000000が128になるということを今度は逆から計算してみるという試みです。
手順は単純に負の数を求めた時の逆をやっていきます。
2の補数での負数から-1します。その数をビット反転します。ここで出た2進数が絶対値になります。ではやってみます。
10000000-1=011111111→10000000
8ビットの8桁目が1なので絶対値が128ということがわかりました。
ここでの最上位ビットの意味
この絶対値を割り出す計算で最上位ビットが使われていることが気になった方🙆ですね。そうなんです最初に最上位ビットは符号ビットに使われるということを書いているので違和感があると思います。
しかし、ここでは符号ビットは関係なくなります。改めて計算を見てみましょう。
10000000-1=011111111→10000000
最初のマイナス1されている10000000は最上位ビットが符号ビットになっています。ただその後に計算し、ビット反転した後の10000000はただの計算結果で絶対値を表すだけのものなのでもう今回の「2進数8ビットで負の数を2の補数で表す」ということからは外れているんですね。
コメントを残す