Java入門|ビットとバイト

ビットとバイトがわかると、型の大きさと数のしくみがすっきり見えてくる

データ型を学んでいると、1バイト、2バイト、4バイト、8バイトという表現がよく出てきます。けれども、最初のうちは、この数字が何を意味しているのか少しつかみにくいかもしれません。ここで大切になるのが、ビットとバイトという考え方です。

コンピュータは、私たちが普段使っている10進数ではなく、0と1を使った2進数で値を扱っています。そのため、型のサイズを理解するには、まず0と1がどのように並んで情報を表しているのかを知る必要があります。ビットはその最小単位であり、バイトはそれを8個まとめた単位です。

このしくみがわかると、なぜ short型が -32768 から 32767 までの範囲を表せるのか、なぜ型のサイズが大きいほど扱える値の範囲が広くなるのか、といったことが自然につながって見えてきます。型の表に書かれていたバイト数も、ただの暗記事項ではなく、意味のある数字として理解できるようになります。

ここでは、ビットとは何か、バイトとは何か、そしてそれらが型のサイズや値の範囲とどのように結びついているのかを、ひとつずつ丁寧に見ていきましょう。

コンピュータは0と1で数を表している

コンピュータは、内部で値を扱うときに0と1を使っています。これは2進数という表し方です。

私たちは普段、0から9までの数字を使う10進数で数を表しています。たとえば、13という数は、1と3を使って表します。一方で、コンピュータの内部では、0と1だけを使って数を表します。これが2進数です。

2進数では、数字として使えるのは0と1だけです。そのため、数は0と1の並びとして記録されます。最初は少し不思議に感じるかもしれませんが、コンピュータにとってはこの0と1の区別がとても扱いやすく、電気的な状態とも結びつけやすいため、基本のしくみになっています。

型のサイズを理解するには、この0と1の並びが何桁あるかがとても重要になります。なぜなら、その桁数が増えるほど、表現できる値の種類も増えていくからです。

ビットとは何か

2進数の1桁分を、ビットと呼びます。

たとえば、次のような2進数を見てみましょう。

00101110

この中の1つ1つの桁、つまり 0 や 1 がそれぞれ1ビットです。
言い換えると、ビットはコンピュータが情報を表すときの最も小さな単位です。

1ビットで表せる値は、とてもシンプルです。0 か 1 のどちらかだけです。つまり、1ビットで表せるのは2通りです。

単位表せる値
1ビット0 または 1

このように、1ビットだけでは非常に少ない情報しか表せません。しかし、ビットをいくつも並べることで、より多くの値を表せるようになります。コンピュータは、このビットの並びを使って数値や文字などを表現しています。

バイトとは何か

ビットが8個集まったものを、バイトと呼びます。
つまり、1バイトは8ビットです。

たとえば、次の2進数は8桁あります。

00101110

これは8ビットなので、1バイトにあたります。

バイトという単位が重要なのは、コンピュータの多くのデータサイズがこの単位で語られるからです。型の説明で出てきた short は2バイト、int は4バイト、long は8バイトという表現も、すべてこのバイトをもとにしています。

まずは、次の対応をしっかり押さえておくとわかりやすいです。

単位内容
1ビット2進数の1桁
1バイト8ビット

この関係がわかると、2バイトなら16ビット、4バイトなら32ビット、8バイトなら64ビットというふうに、すぐに考えられるようになります。

ビット数が増えると表せる値の数も増える

ビットの数が増えると、それだけ多くの値を表せるようになります。
これは型のサイズと値の範囲の関係を理解するうえで、とても大切な考え方です。

1ビットでは、0 か 1 の2通りです。
2ビットでは、00、01、10、11 の4通りです。
3ビットでは、8通りです。

このように、ビットが1つ増えるごとに、表せる値の数は2倍になっていきます。つまり、nビットで表せる値の種類は 2ⁿ 通りです。

ビット数表せる通り数
1ビット2通り
2ビット4通り
3ビット8通り
8ビット256通り
16ビット65536通り

この表を見ると、ビット数が増えることで表現力が大きく広がることがよくわかります。型のサイズが大きいほど表せる値の範囲が広くなるのは、まさにこのためです。

1バイトで表せる値は256通り

1バイトは8ビットなので、表せる値の通り数は 2⁸ です。
計算すると、256通りになります。

つまり、1バイトでは 00000000 から 11111111 までの8桁の2進数を使って、全部で256種類の状態を表せることになります。

ここで大事なのは、1バイトだから256という数字を丸暗記するのではなく、8ビットあるので 2⁸ 通りになる、と考えられることです。しくみで理解しておくと、2バイトや4バイトになったときも自然に応用できます。

2バイトのshort型は16ビットで表される

short型は2バイトです。
1バイトが8ビットなので、2バイトは16ビットになります。

たとえば、short型の値はコンピュータの内部では次のような16桁の2進数として表されます。

00000000 00000011

このように、8ビットが2つ並んで、合計16ビットになっています。
そのため、short型で表せる値の通り数は 2¹⁶ です。計算すると 65536通りになります。

ここで見えてくるのは、short型が2バイトであることと、扱える値の範囲が決まっていることがしっかり結びついているということです。単に short は -32768 から 32767 までと覚えるのではなく、16ビットで65536通りを表せるから、その範囲の整数に対応できるのだと理解すると、ずっと納得しやすくなります。

図でイメージするビットとバイト

この図では、2進数の1桁が1ビットであり、8桁そろうと1バイトになることを表しています。ビットは最小単位、バイトはそれを8個まとめた単位、という関係がひと目でつかめます。

この図を見ながら、型のサイズが何バイトかという話は、実際には何ビットで値を表すのかという話につながっているのだ、と意識しておくと理解が深まります。

16ビットで65536通りを表せる理由

16ビットで 65536 通りを表せるのは、1桁ごとに 0 または 1 の2通りの選び方があるからです。

たとえば、1ビットなら2通り、2ビットなら 2×2 で4通り、3ビットなら 2×2×2 で8通りになります。これを16ビットまで広げると、2 を16回かけることになり、2¹⁶ つまり 65536 通りになります。

この考え方がわかると、型のサイズを見るときの見え方が変わってきます。2バイトと聞いたら、16ビットだから 65536 通り。4バイトと聞いたら、32ビットだから 2³² 通り。こうして表現できる値の数が、サイズから見えてくるようになります。

short型では65536種類の値を整数に対応させている

short型では、16ビットで表せる65536種類の値を、10進数の -32768 から 32767 までの整数に対応させています。

対応のしかたを表にすると、次のようなイメージになります。

コンピュータの内部(2進数)あらわしている数値(10進数)
00000000000000000
00000000000000011
00000000000000102
011111111111111132767
1000000000000000-32768
1000000000000001-32767
1111111111111111-1

この表を見ると、2進数の並びと10進数の値が対応していることがわかります。
特に注目したいのは、途中から正の数ではなく負の数に切り替わっていることです。これによって、short型は正の整数だけでなく、負の整数も表せるようになっています。

先頭の1ビットは正負と深く関係している

short型の値を見ると、先頭の1ビットがとても大事な役割を持っています。

先頭が 0 のときは正の数の範囲に対応し、先頭が 1 のときは負の数の範囲に対応しています。たとえば、0111111111111111 は 32767 を表し、1000000000000000 は -32768 を表します。

このように、先頭のビットを見ることで、その値が正の数側なのか負の数側なのかがわかるしくみになっています。

ここではまず、正の数では先頭が 0、負の数では先頭が 1 になる、という基本イメージをつかんでおくことが大切です。ビット列の先頭が値の正負に関係していることを知っておくと、整数型の範囲がなぜ左右に分かれているのかも理解しやすくなります。

図でイメージするshort型の内部表現

この図では、short型が2バイト、つまり16ビットで表されることを視覚的に示しています。8桁ごとに区切ることで、1バイトが2つ集まっていることがわかりやすくなります。

この図を見ながら、2バイトというサイズは単なる数字ではなく、16個のビットを使って値を表しているという意味なのだ、と捉えると理解しやすくなります。

型のサイズと値の範囲が深く関係する理由

ここまで見てくると、型のサイズと値の範囲が深く関係している理由がはっきりしてきます。

型のサイズが大きいということは、使えるビット数が多いということです。使えるビット数が多いということは、0と1の組み合わせの数が増えるということです。組み合わせの数が増えれば、その分だけ多くの値を表せるようになります。

この流れを整理すると、次のようになります。

順番内容
1型のサイズが決まる
2使えるビット数が決まる
30と1の組み合わせ数が決まる
4表せる値の範囲が決まる

このつながりがわかると、byte、short、int、long の違いもぐっと理解しやすくなります。どれも整数型ですが、サイズが違うため、表せる範囲も違うのです。

ビットとバイトを知ると型の表が読みやすくなる

データ型の表を見るとき、ビットやバイトの知識があるかどうかで見え方が大きく変わります。

ただ数字を覚えるだけだと、short は2バイト、int は4バイト、long は8バイトという情報がばらばらに感じられます。けれども、1バイトは8ビットで、ビット数が増えると表せる値の種類が 2ⁿ 通りになるとわかっていれば、それぞれの型の違いにきちんと理由があることが見えてきます。

つまり、ビットとバイトは、型のサイズを理解するための土台です。そして、型のサイズがわかると、なぜその型で扱える値の範囲が決まっているのかも自然に理解できるようになります。

Javaの学習では、最初は変数や型の名前に目が向きやすいですが、その背後にはこうしたコンピュータの基本的なしくみがあります。この基本を押さえておくと、これから先に学ぶ整数型、小数型、メモリ、内部表現といった話も、ずっと納得しやすくなります。

必要であれば次に、この続きとして「変数の宣言と代入」や「整数型と小数型の違い」も同じ文調でつなげて執筆できます。