2 進数 で負の数を取り扱う場合、 「符号つき 2 進数」 を使用します。
「符号つき 2 進数」 といっても、 2 進数の前に "+" や "-"
の記号がついているわけではありません。
下表は、 8 桁の 2 進数について、 符号つき 2 進数と符号なし 2 進数を比較したものです。
符号つき 2 進数は最上位ビット
(MSB: most significan bit) が負の数を表し、
これを符号ビット
(sign bit) といいます。
赤く表示しているのが符号ビットです。
符号なし 2 進数 | 符号つき 2 進数
|
---|
2 進数 | 10 進数 | 2 進数 | 10 進数
|
00000000 | 0
| 00000000 | 0
|
00000001 | 1
| 00000001 | 1
|
00000010 | 2
| 00000010 | 2
|
|
|
01111101 | 125
| 01111101 | 125
|
01111110 | 126
| 01111110 | 126
|
01111111 | 127
| 01111111 | 127
|
10000000 | 128
| 10000000 | -128
|
10000001 | 129
| 10000001 | -127
|
10000010 | 130
| 10000010 | -126
|
|
|
11111101 | 253
| 11111101 | -3
|
11111110 | 254
| 11111110 | -2
|
11111111 | 255
| 11111111 | -1
|
最上位ビット
(MSB) は負の数を表しますから、 8 ビットの符号つき 2 進数では、
これが "1" の場合 -1 × 2
7 = -128 になります
![](data:image/gif;base64,R0lGODlhEgAPALMAAGNjY+Dg8P///////////////////////////////////////////////////////yH5BAEAAAEALAAAAAASAA8AAAQjMMhJJaj1TsCxDZf2eWBHiRiHgmTIbuR4xi3trXau73zv0xEAOw==)
。
したがって上表の通り、 8 ビットの符号つき 2 進数、"1000000" は -128 で、
"1000001" は -127、 "11111111" は -1 です。
符号ビットが "0" であれば、 符号なし 2 進数と全く同じです。
8 ビットの符号なし 2 進数は 0 ~ 255 の整数を表すのに対して、
符号つき 2 進数は -128 ~ 127 の整数を表します。
8 ビットの 2 進数は、 どちらも 256 種類の数字を表すことができます。
下図は、 符号つき 2 進数と、符号なし 2 進数を分かりやすく表しています。
最初は符号なし 2 進数として表示されていますが、
![符号つき/符号なし 切替ボタン](data:image/gif;base64,R0lGODlhEgAQALMAADExMUJCQlJSUoSEjJSUpbW1vbW1zr291sbG2s7O1s7O3tbW1tbW3tbW5/f39////ywAAAAAEgAQAAAEZfC5Sat1yTHEu/eF4CBGyZVoSgRjeUhpqZRreyDScaANadSch3BY6qGAuKHQYDyyfC9H0edsGaJMalVr2CSHCGBqY1AoH+EniuzS6X7qKzcmjtlprAJhz+/3BwEJAgGEhYaHABEAADs=)
をクリックすると
符号つき/符号なし が切り替わります。
2 進数の数字や下のボタンをクリックすると、 値を自由に変えることができます。
「レ」 ボタンをクリックすると、数値はクリアされて 0 になります。
「▲」 ボタンをクリックすると数値はひとつ大きく、 「▼」 ボタンをクリックするとひとつ小さくなります。
符号つき 2 進数も符号なし 2 進数も、-や+の記号がついていないので、 見た目で区別できません。
"10110001" は -79 なのか 177 なのか分かりませんが、 構わないのでしょうか?
符号つき2進数と符号なし 2 進数が混在していると、 ヒトには区別できませんから、 もちろん困ります。
私の借金が貯金に変わる… のなら困りませんが。
ヒトには区別できませんが、 幸いなことに、 これらはコンピュータの中で使用されています。
コンピュータはこれらのデータをプログラムに従って処理していきますが、 そのプログラムには、
これは符号付き2進数として処理しなさい、 これは符号なし2進数として計算しなさい、
というようなことが逐一指定されています。
ヒトは区別できなくても、 コンピュータはプログラムの指示に従って正しく処理できますから、
問題はないのです。