【C言語】バイト・ビット・2進数・16進数を理解しよう!

2020年6月30日

今回から、プログラミングを行う上で避けては通れないデータの型(かた)、およびそれを学習するために必要となるデータの基礎知識について理解してきましょう。C言語に限らずほぼ全ての言語で必要であり、共通の知識になりますので、確実に抑えていきましょう!

まずは、プログラミング上のデータを理解する上で欠かせない「バイト」「ビット」、および「2進数」「16進数」の概念について理解しましょう。特にC言語はバイト/ビット演算が容易なので、理解を深めやすいです。

  • バイト・ビットの理解
  • 2進数・10進数・16進数の理解
  • プログラマー電卓の利用方法の理解

「ビット」と「バイト」

「ビット」とは

ビットとは、「0」か「1」かを表すデータの最小単位です。ローマ字では「Bit」と記載します。コンピューター上の全てのデータはビットを複数個集めることによって構成されています。

1ビットでは0か1の2種類しか表現できませんが、ビットを複数組み合わせることによって、表現できるデータ数が増えていきます。

  • 1ビットであれば、表現できる情報は「0 or 1」の、合計2通り
    (0、1)
  • 2ビットであれば、表現できる情報は「0 or 1」×「0 or 1」の、合計4通り
    (00、01、10、11)
  • 3ビットであれば、「0 or 1」×「0 or 1」×「0 or 1」の、合計8通り
    (000、001、010、011、100、101、110、111)

2、4、8、16、…と、情報量が増えていくのが分かると思います。数式にすると、nビットで表せる情報=2のn乗になるということです。公式でもなんでもないので覚える必要はありませんが、2の乗数的に増えていくということを感覚的に覚えておいてください。


「バイト」とは

バイトとは、8ビットを表すデータの単位です。ローマ字では「Byte」と記載します。コンピューター上のデータを表す単位としてよく用いられます。

先ほどのビットの復習です。ビットは「0」か「1」かを表す最小データでしたね。これが8個あるのですから、合計2の8乗=256通りのデータを表現できることになります。

(0000 0000、0000 0001、0000 0010、…(省略)…、1111 1110、1111 1111)の、合計256通り

ちなみに、なぜ8ビットのことを1バイトと呼ぶようになったかについては、ググれば諸説出てきますので見てみて下さい。ただし、混乱する可能性もあるため、ある程度プログラミングを経験された方のみ調べることが好ましいです。知らなくていいような知識、混乱するような知識が多く出てきますから。

2進数、10進数、16進数

2進数とは

2進数とは、2で位が一つあがる数字の表現方法になります。

一般的にプログラミングの世界では、「2進数」「10進数」「16進数」を理解する必要があります。その中でも、私たちが日常的に使っているのは「10進数」と呼ばれる、数値が10に到達するごとに位が一つあがる表現方法です。

0、1、2、3、4、…、9、10、11、…、19、20、21、…

一方、2進数とは、数値が2に到達するごとに位が一つ上がる表現方法です。

0、1、10、11、100、101、110、111、1000、1001、…

これ、先ほど説明した何かに似ていませんか?

そう、2進数表記とはビットデータの羅列そのものです。2で位が上がるため、数字としては0、1しか存在しません。これはビットデータに他なりません。この考えはビット演算を行うときに必要となってきますので、そのときにじっくり深堀してみましょう。


16進数とは

16進数とは、16で位が一つ上がる数字の表現方法になります。

16進数の場合、0~15までが一桁になるわけです。ただし、数値は「0~9」までしかないですよね。

そこで、大分慣れないと思いますが、16進数における「10~15」はアルファベットで表記すると定められています。下表の様に対応します。

10進数16進数
10a
11b
12c
13d
14e
15f

アルファベットは小文字でも大文字でもかまいません。どちらを使うという慣習も(残念ながら)ほとんどありません。上表に従い、16進数は以下の様に増えていくことになります。

0、1、2、3、4、5、6、7、8、9、a、b、c、d、e、f、10、11、12、…、19、1a、1b、…

さて、ここで一つ問題があります。10進数、16進数の混在する環境(これからたくさん出てきます)で、「10」と書かれた時、果たしてどちらを表現しているのか分からなくなりますよね。

それを解決するために、よく16進数表記の数値は数字の前に「0x」を付けます

例えば、10進数での10=16進数での「0x0a」、10進数での16=16進数での「0x10」ですね。これで10進数と16進数の区別を行う必要があります。


16進数とバイトの関係

では、そもそもなぜ16進数という表記があるのか。

それは、「1バイト(8ビット)は256通りのデータを表現できる」と上で書いたことに関係があります。

8ビットを分解すると、4ビット+4ビットになりますよね。

では、4ビットで表現できるデータ数はいくつでしょうか?


・・・答えは、2の4乗で16通りになります。4ビットのデータの表現範囲は16進数で「0~f」と書けるわけですね。

つまり1バイトの表現範囲は「0~0xff」になります。

これが非常にバイトデータを扱う上で相性がよく、2バイトであれば「0~0xffff」、4バイトであれば「0~0xffffffff」と、簡単に書くことが出来ます。

10進数の場合だと、2バイトであれば「0~65535」、4バイトであれば…「0~4294967295」…うーん、覚えられん!!ってなりますよね(歴10年でも覚えていないので安心してください)。16進数はバイトデータを扱う場合に非常に相性がいいわけです。。


プログラマー電卓で遊んでみよう

10進数、16進数の扱いに慣れるために、Windowsの標準ソフト「電卓」を開いてみましょう。

メニューから探してもいいですが、「Windowsキー」+「Rキー」を同時に押して、「calc」と打ち込むのが一番早いですよ。(calculatorで電卓の意味ですね)

電卓が起動したら、左上の表示から「プログラマ電卓」を選んでください。

プログラマ電卓

プログラマー電卓が表示されると思います。数値下のビットが並んでいるのは、数字を2進数表記してくれています。例えば10進数で「155」と入力し、16進数に切り替えると「9B」に変わります。計算としては、9×16 + B(11) = 155だから、正しいことが分かると思います。ちなみに、2進数表記は「1001 1011」になります。

プログラマ電卓_10進数
プログラマ電卓_16進数

電卓を色々いじくってみて、10進数と16進数の扱いに少しでも慣れておいてください。この先かなり使います。逆に言うと、使っていると、勝手に体になじんでくるんですけどね。


まとめ

バイト、ビット、2進数、16進数については、「まだ少し意味が分からない」「何に使うの?」という方も多いと思いますが、いったんはOKです。次のページの内容とほとんどセットなのと、実際にプログラムを組んでから理解が深まってくるところでもありますので、次のページを最後までお読みいただいてから、また戻ってきてください。