組込みエンジニアになろう

/*** 初心者が基礎から組込みスキルを習得して、マイコンを操れるようになるサイト ***/

【C言語(3)】データの単位

f:id:myra-sctech:20210814125048p:plain


この記事では、プログラムで扱うデータの単位について解説します。

C言語』のタイトルを打っておきながら、ここまで全くプログラムが出てこず面白くないですね。すみませんッ!

ですが、基礎をしっかり踏み固めてから先へ進む方が、間違いなく面白くなります。

次回からはプログラムを作り始めますので、今回まで踏ん張って基礎を習得していきましょう!

 データの単位

データの定義

まずは『データ』とは何か、を定義しておきましょう。

この記事で扱うデータとは、コンピュータ(マイコン)が扱う数値とします。つまり、【C言語】(1)で解説した、2進数の羅列で表されるあのスイッチの組合せのことです。

 

bit

これまでは2進数の1桁をスイッチと呼んで説明を行ってきました。

イメージから理解する方が容易なのでスイッチと説明していましたが、実は正確な呼び名ではありません。

正しくは、0と1で表される2進数の1桁をbit(ビット)と呼びます。bitは『binary digit』の略です。単位はb(小文字)を使用します。

例えば、2進数4桁であれば4bit (4b)となります。

1bitはデータの最小単位です。

f:id:myra-sctech:20210214145947p:plain

 

byte

2進数8桁、つまり8bitをまとめてbyte(バイト)と呼びます。単位はB(大文字)を使用します。

例えば、1byte(1B)= 8bit(8b)、2byte(2B)= 16bit(16b)となります。

f:id:myra-sctech:20210214150031p:plain

これは知っていなくても困ることのない話ですが、実は歴史的に長い間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(さになろはー、さになろはー♪)。)

*3:メモリ:情報を記憶するデバイスのこと。マイコンの中にも入っているし、マイコンの外に置いて使われることもある。

*4:キビバイト:スペルはkibibyte(kilo binary byteの略