【C言語(3)】データの単位
この記事では、プログラムで扱うデータの単位について解説します。
『C言語』のタイトルを打っておきながら、ここまで全くプログラムが出てこず面白くないですね。すみませんッ!
ですが、基礎をしっかり踏み固めてから先へ進む方が、間違いなく面白くなります。
次回からはプログラムを作り始めますので、今回まで踏ん張って基礎を習得していきましょう!
データの単位
データの定義
まずは『データ』とは何か、を定義しておきましょう。
この記事で扱うデータとは、コンピュータ(マイコン)が扱う数値とします。つまり、【C言語】(1)で解説した、2進数の羅列で表されるあのスイッチの組合せのことです。
bit
これまでは2進数の1桁をスイッチと呼んで説明を行ってきました。
イメージから理解する方が容易なのでスイッチと説明していましたが、実は正確な呼び名ではありません。
正しくは、0と1で表される2進数の1桁をbit(ビット)と呼びます。bitは『binary digit』の略です。単位はb(小文字)を使用します。
例えば、2進数4桁であれば4bit (4b)となります。
1bitはデータの最小単位です。
byte
2進数8桁、つまり8bitをまとめてbyte(バイト)と呼びます。単位はB(大文字)を使用します。
例えば、1byte(1B)= 8bit(8b)、2byte(2B)= 16bit(16b)となります。
これは知っていなくても困ることのない話ですが、実は歴史的に長い間1byteが何bitであるかは決められていなかった*1ようです。
1byteが6bitだったり7bitだったりしたものもあったとか。
その名残りか、8bitであることを明示するためにbyteではなく、octet(オクテット)という呼び名が使用されている文書(仕様書など)をたまーに見かけるので、参考までに紹介しておきます。
1octet = 8bitです。
word
word(ワード)は使っているマイコン(正しくはマイコン内のCPU)の種類によってサイズが異なります。
今の時点でここまで理解する必要はありませんので、一読して『は?』となれば読み飛ばしていただいて問題ありません。今後マイコンを触り始めて、wordって何だっけ?と疑問を感じたときに戻ってきてください。
CPUには8bitCPUや16bitCPU、32bitCPU、64bitCPUなどと呼ばれる種類があります。
これはマイコンのカタログ(データシート)に記載されています。
これが何を意味するかはマイコンの章でお話ししたいと思いますが、1wordのサイズは、8bitCPUでは8bit(1byte)、16bitCPUでは16bit(2byte)、32bitCPUでは32bit(4byte)、64bitCPUでは64bit(8byte)となります。
ただ、何故か私の周りでは1word = 2byteという認識をされている方が多いです。不思議です。。
bitと組み合わせ数
データの単位を習得したところで、bitとその組み合わせ数についても説明します。
2進数を解説した記事では、簡単のために4bitで説明を行いました。4bitでは0~15までの合計16個の組み合わせがありましたね。
マイコンを動かすプログラムを作るにあたって、できれば16bitまでの組み合わせ数は知っておきたいです。
プログラムを作っていくと自然に覚えてくるかもしれませんが、いちいち組み合わせ数を調べたり計算するのは手間なので、頑張って覚えちゃいましょう*2。
16bitまでの組み合わせ数を表にしたのでご覧ください。
計算式も載せていますので関数電卓をお持ちの方は計算してみてください。
お持ちでない方も1をビットの数だけ2倍2倍・・・2倍と計算すると組み合わせ数を求めることができます。
ビット数 | 表現可能な数 (正数表現) |
表現可能な数 (負数表現) |
組み合わせ数 | 計算式 2(bit数) |
---|---|---|---|---|
1bit | 0 ~ 1 | -1 ~ 0 | 2 | 21 |
2bit | 0 ~ 3 | -2 ~ +1 | 4 | 22 |
3bit | 0 ~ 7 | -4 ~ +3 | 8 | 23 |
4bit | 0 ~ 15 | -8 ~ +7 | 16 | 24 |
5bit | 0 ~ 31 | -16 ~ +15 | 32 | 25 |
6bit | 0 ~ 63 | -32 ~ +31 | 64 | 26 |
7bit | 0 ~ 127 | -64 ~ +63 | 128 | 27 |
8bit(1byte) | 0 ~ 255 | -128 ~ +127 | 256 | 28 |
9bit | 0 ~ 511 | -256 ~ +255 | 512 | 29 |
10bit | 0 ~ 1023 | -512 ~ +511 | 1024 | 210 |
11bit | 0 ~ 2047 | -1024 ~ +1023 | 2048 | 211 |
12bit | 0 ~ 4095 | -2048 ~ +2047 | 4096 | 212 |
13bit | 0 ~ 8191 | -4096 ~ +4095 | 8192 | 213 |
14bit | 0 ~ 16383 | -8192 ~ +8191 | 16384 | 214 |
15bit | 0 ~ 32767 | -16384 ~ +16383 | 32768 | 215 |
16bit(2byte) | 0 ~ 65535 | -32768 ~ +32767 | 65536 | 216 |
膨大なbit数の表現方法
先ほど表のような2byteくらいのサイズであれば何ともないですが、実際のマイコンには数十~数百万byteものサイズのメモリ*3が内蔵されています。
例えば、268,435,456byteみたいな。
このように実際に全桁書いても良いのですが、桁数が多いので非常に見にくいですね。
そこで、大きいサイズは『2進接頭辞』というものを用いて表すことが一般的です。
2進接頭辞とは、パソコンやスマートフォンの容量で聞き馴染みがあると思いますが、MB(メガバイト)やGB(ギガバイト)の、"M"や"G"のことです。
下に一例を示します。
2進接頭辞 | 例 | サイズ | 計算式 |
---|---|---|---|
K(キロ) | 1KB | 1024B | 210B |
M(メガ) | 1MB | 1024KB | 220B |
G(ギガ) | 1GB | 1024MB | 230B |
T(テラ) | 1TB | 1024GB | 240B |
ちなみに、K(キロ)は大文字で書かれていることに注意してください。小文字で書いたk(キロ)は1000倍の量を表すSI接頭辞と呼ばれるものになります。
1Kbyte=1024byte、1kbyte=1000byteです。
ここまで理解したところで、『1キロバイトは何ビットですか?』と言われたら困りませんか。『その"キロ"は大文字ですか?小文字ですか?』と聞き返すのも。。笑
そこで、実はIEC(国際電気標準会議)規格により2進接頭辞が決められており、1024byte=1Kibyte(キビバイト*4)とされています。
同様に1024Kibyte=1Mibyte(メビバイト)、1024Mibyte=1Gibyte(ギビバイト)、1024Mibyte=1TiB(テビバイト)と決められています。
ただ、私は使ったことも聞いたこともありません。実際にはキロバイトと言った際には1024byteのことを言っていると暗黙的に捉えられると思います。
知識として知っておくと良いかな、というレベルの紹介でした。
理解度チェック
この記事の内容をおさらいしておきましょう。
【答えを表示】をクリックすると回答例を表示します。
(1)2byte、4byteはそれぞれ何bitでしょうか。
2byte=16bit(2byte×8bit)
4byte=32bit(4byte×8bit)
1byte=8bitですので、8bitを掛ければbit数が計算できます。
(2)8bitの組み合わせ数は、7bitの組み合わせ数の何倍でしょうか。
2倍(256/128=2)
bitが1つ増えるごとに組み合わせ数は2倍になります。逆を言えば、bitが1つ少なくなるごとに組み合わせ数は1/2倍になります。
これは後に紹介予定のビット操作で利用する重要な特徴ですので、是非とも覚えておいてください。
(3)1Mbyteは何bitでしょうか。
8,388,608bit(1Mbyte×1024×1024×8bit)
1Mbyte=1024Kbyte、1Kbyte=1024byteです。
したがって、1Mbyte=1024Kbyte×1024=1,048,576byteです。
求めたいのはbit数なので8bitを掛けて、1MB=1,048,576byte×8bit=8,388,608bitとなります。
最近のスマートフォンでは256Gbyteや512Gbyteなどが当たり前になっており、1Mbyteはとても小さく感じますが、それでもbit数にするとかなりの大きさですね。
次回はいよいよC言語を学習するための環境を整えます。お楽しみに!
/*** このサイトでは脚注を豊富に記載します ***/
*1:1byteが何bitであるかは決められていなかった:IEC(国際電気標準会議)規格 [ IEC 80000-13 ]に1byteが8bitであることが定義され、2008年に発行されたそうです。C言語が1973年に生まれたことを考えると、案外最近です。
*2:頑張って覚えちゃいましょう:特に8bit、16bitは重要なので覚えておくと後々便利です。私はリズムで覚えました。8bitは256(にごろ、にごろ、にごろ♪)、16bitは65536(ろくごーごーさんろく、ろくごーごーさんろく♪)。それぞれの半分も、7bitは128(いちにーはち、いちにーはち♪、15bitは32768(さになろはー、さになろはー♪)。)