2進数でマイナスの値を表すのはどうすればいいのか?
今回は負の値について書きます。
本当は、2進数のことについて書いた時の書くべきでした(~~;
申し訳ないです。
10進数から2進数への変換は分かると思います。
25 ---> 00011001
となります。
まぁ計算をわざわざするのも面倒なので、ツールとかでパッとやってしまいます。
計算を電卓でやるのと同じですね^^
変換の仕方は、このようにします。
MSX マシン語入門(Z80 アセンブラ・機械語) 勉強レポート 第2回 2進数 - ニャオニャオ21世紀
この第2回では、2進数でマイナスの値を書いていませんでした。
例えば、10進数で、-25というのを、2進数で表す方法です。
それには
2の補数というのを使います。
10進数 25 ---> 2進数 00011001
10進数 -25 ---->2進数 11100111
違いがわかりますでしょうか?
説明します。
負の値の場合は、
例えば-25の時、
プラスの25をマイナスの25に直す感じでやります。
2進数の負の値の場合、
まず先頭1ビットを、1にします。
25を例にやってみます。
10進数 25 00011001
↓
10011001(先頭1ビットを1に)
2進数の先頭ビットが1の時は、負の値。
しかし、符号ありとか、2の補数でって書いてある時だけ負の値です。
通常の時は、先頭ビットが1であっても負の値ではないのです。
ややこしいです〜。
そうでないと、通常時の、11111111 -> 255 という値が表現できません。
先頭1ビットを1にしたあと、
残りの各ビットを反転します。
0 なら 1、
1 なら 0 へ。
10進数 25 00011001
↓
10011001 (先頭1ビットを1に)
↓
11100110 (残りのビットを反転)
最後に最終ビットに1を足します。
10進数 25 00011001
↓
10011001 (先頭1ビットを1に)
↓
11100110 (残りのビットを反転)
↓
11100111 (最終ビットに1を足す)
やることが多いですねw
2の補数表現を使った場合8ビットだと、-128 ~ 127 が表現できます。
使わないと8ビットは、0 ~ 255 の表現ですので、
同じ8ビットでも扱う数字が変わってきてしまいます。
ここは要チェックです!
マシン語で、演算の引き算をしたときに、
負の値になることがあると思いますが、
そのとき、2の補数を使った値になります。
演算結果が、-25のときは、11100111です。
演算結果が、正か負かは、FレジスタのSフラグでわかります。
Sフラグについてはこちらで書いています。
MSXマシン語入門(Z80 アセンブラ・機械語) 勉強レポート 第20回 Fレジスタの使い方 - ニャオニャオ21世紀
2の補数については、こちらの方々の説明が詳しいです。
この方は、より詳しく書いています。
いやー奥が深いですねぇ。
> 計算結果はマイナスでも、その数を正と見るか負と見るかは、プログラム(を書く人)しだいなのです。
> 11111110
> この-2を正の数と見れば254である。正か負かは コンピュータ自身には関係ない
この辺りが面白いですねぇ。
1111110は、普通に見れば254。2の補数で見れば-2。
その値に10を足すと、
-2 + 10 (2の補数としてみれば)
または、
254 + 10 (普通の値として見れば)
2進数で考えると、
11111110 (-2 または 254)
+ 00001010 (10)
------------------
1 00001000 (結果)
8ビットだけでみれば、8ですし、(-2+10の答え)
9桁目も数えれば、264。 (254+10の答え)
面白い!
詳しくは上の方のサイトをご覧ください^^
コンピュータというのは実によく考えられています。
本当にすごい!
その仕組みを学んでいくことの面白さを感じます^^
まとめ
負の値は、2の補数で表すことができます。
2の補数というのは大変興味深いということがわかりました。
もっと詳しく知りたい方は、他のサイトにもたくさん情報がありますので、
"2の補数"
で検索してみてはいかがでしょうか?
次回は、いつもの本で、
ビット単位のデータ操作という章をやりたいと思います。
MSX BASICの情報はこちらへ〜
MSXマガジン 永久保存版3には、
BIOSの一覧が載っています^^
手元に置いておくと、MSXマシン語で開発するときに役に立ちそう♪( ´▽`)
つづきはこちら。