負数の表現
負数の表現
いままでは正数(0より大きい実数)の基数変換を説明してきました。
今回は負数(0より小さい実数)の説明です。![]()
![]()
負数は面倒で。。![]()
いくつか表現方法がありますが、代表的な2つを紹介します。
【記号付表現】
先頭ビットを負の記号として負数を扱います。
1バイトの場合
例)-1(2進)
10000001
↑
先頭ビットは符号として使用し、1のときは負数を表す。
例)-127(2進)
11111111
じゃあ、正数はとなると
例)127(2進)
01111111
↑
先頭ビットは符号として使用し、0のときは正数を表す。
となります。
整理してます。![]()
1バイトで先頭符号としたビット列で扱える数値範囲
正数
00000000(2進) ~ 01111111(2進)
範囲:0~127
負数
10000000(2進) ~ 11111111(2進)
範囲:0~-127
先頭が符号ですから意外とわかり易いですね。![]()
つぎは。
【補数】
2進数であれば、2の補数(ほすう)といい。
負数をある規則で表現します。
補数で表現すると以下の特徴が発生いたします。![]()
「引き算も足し算もすべて足し算で計算することができる」のです![]()
不思議ですね。
意味わかりませんね。
では、見て行きましょう。![]()
まずは表現方法です。
【2の補数へ変換】
1.負数を正数でビット列に表現します。
例)-1(2進)
正数として表現します。
1(2進)→ 0001(2進)
2.ビットを反転します。
例)0001(2進)
ビット反転(0→1、1→0)します。
0001(2進)→ 1110(2進)
3.1を加算します。
例)1110(2進)
1を足します。
1110(2進)→ 1111(2進)
-1(2進)を2の補数で表現すると、「1111」となります。
もとに戻す方法を説明しておきます。
【2の補数から戻す】(2の補数の絶対値)
2の補数の変換手順を逆に行えばもとに戻すことができます。
1.2の補数kら-1します。
例)マイナス1します。
1111(2の補数)→ 1110(2進)
2.ビットを反転します。
例)1110(2進)
ビット反転(0→1、1→0)します。
1110(2進)→ 0001(2進)
ほら、1111(2の補数)は0001(2進)に変換でき、1(10進)にできました。
では
「引き算も足し算もすべて足し算で計算することができる」のですから試してみましょう。
【ケース1】
1+-1=0を試します。
1(10進)→ 0001(2進)
-1(10進)→ 1111(2進)
では、足します。
0001
+)1111
-----
10000
10000となりました。
ん!?4ケタだったのに5ケタにケタ上げされてますね。。。
そう、補数での計算では、以下のルールがあります。
「ケタ上げしたは切り捨てる」のです。
もともと4ケタでしたから、5ケタ目を捨てます。
10000 → 0000
ほら、1+-1=0 になりましたね。
【ケース2】
-1+-1=-2を試します。
-1(10進)→ 1111(2進)
-1(10進)→ 1111(2進)
では、足します。
1111
+)1111
-----
11110
11110となりました。
ん!?またまた4ケタだったのに5ケタにケタ上げされてます。
「ケタ上げしたは切り捨てる」ので
もともと4ケタでしたから、5ケタ目を捨てます。
11110 → 1110
1110(2進2の補数)になりました。
では、検算してみます。
2の補数を戻す(検算)する方法は 「2の補数の手順を逆にすればいい」ので。
1110(2の補数)→ マイナス1します → 1101 → 反転します → 0010
1110(2の補数)の絶対値は、0010(2進)=2(10進)となり
またまた -1+-1=-2 が計算できました。
ずいぶん、長文となりましたが(;´▽`A``
まずは「負数表現には、符号と補数がある」と覚えておいてください。
(^O^)/