解説:教えて那々子先生
中途半端な数字なのはなぜ?
キーポイントとなるのは2進数です。
よくコンピューターが「0と1だけの世界」と言われるように、コンピューターの内部では、数値データは0と1の羅列で表されます。
その羅列は、整数値であれば、32桁や64桁など、データ型によって決まった長さとなっています。32桁で表された整数を32ビット整数、64桁の場合は64ビット整数と呼ばれます。
例えば、C#ではint(Int32型)やuint(UInt32型)が32ビット整数にあたります。
では、私たちが日常的に用いている1とか2とか3とかの数値を、どうやって0と1だけの羅列に変換するのでしょうか。実は、そこで用いられるのが2進数です。
ここで、10進数と2進数の対応表を見てみましょう。
10進数 | 2進数 |
---|---|
0 |
00000000000000000000000000000000 |
1 |
00000000000000000000000000000001 |
2 |
00000000000000000000000000000010 |
3 |
00000000000000000000000000000011 |
略 | 略 |
4294967295 |
11111111111111111111111111111111 |
ここからわかるのは、4294967295という、いかにも中途半端な数値が、2進数になると32桁すべてが綺麗に1になる、つまり、32桁の2進数で表現できる最大値であるということです。
この2進数をそのまま単純にデータとして用いたものを、符号なし32ビット整数と呼びます。符号なしというのは、正負符号がない、プラスの値のみという意味です。
マイナスの整数値は?
では、マイナスの数値をどう表すのでしょうか。
いくつかの方法はありますが、整数の場合、半分の範囲をマイナス値に読み替えるという決まり事を設けるのが一般的です。
具体的には、32ビット整数(0から4294967295まで)の場合、後半の2147483648から4294967295までの範囲の数値を、それぞれ-2147483648から-1までの範囲に読み替えます。
10進数 | 2進数 |
---|---|
0 |
00000000000000000000000000000000 |
1 |
00000000000000000000000000000001 |
2 |
00000000000000000000000000000010 |
3 |
00000000000000000000000000000011 |
略 | 略 |
2147483647 |
01111111111111111111111111111111 |
-2147483648 |
10000000000000000000000000000000 |
-2147483647 |
10000000000000000000000000000001 |
略 | 略 |
-3 |
11111111111111111111111111111101 |
-2 |
11111111111111111111111111111110 |
-1 |
11111111111111111111111111111111 |
こうすることで、表せる最大値はおよそ半分になってしまいますが、その分だけマイナスの数値も表せるようになります。
このようにマイナスも表せる32ビット整数は、符号付き32ビット整数と呼ばれます。