【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(さになろはー、さになろはー♪)。)
【C言語(2)】負数の表現
前回の記事では、2進数が必要な理由として「スイッチ*1のON(1)とOFF(0)を考えやすくするため」であることを解説しました。
0と1しか使えない制約のなかで、どのようにしてマイナスの数(負数)を表現するのか、今回も基礎的な内容ですがしっかり習得していきましょう。
今回も最後に問題を用意していますので、理解度の確認に役立ててください。
はじめに
マイナス記号(-)は使えません
負の数を表現するなら『-』記号を使えば良いのでは?と考えたくなりませんか。
たとえば-3は-0011(2)みたいな。
私は初めてプログラムの勉強をした時に思いました。だって、プログラムで引き算の計算を書くときには『-』記号を使うのですから。
だけど負の数を表現するのに『-』記号は使えないのです。
ここで前回の記事を思い出してください。
マイコンのプログラムはメモリに書き込まれていて、メモリにはON(1)とOFF(0)しかできないスイッチが数十~数百万個あるのでした。
このスイッチの組み合わせによって数値を表現します。
さて、この記事では簡単のためにスイッチ4個*2で話をしていきたいと思います。つまり、4個のスイッチだけで負数を表現しなければなりません。
初心者の頃の私・・・『スイッチでマイナス記号…どやって表現するねん!』と絶望しましたとさ。
スイッチ4個でいくつ数えられる?(復習)
前回の記事の復習になりますが、スイッチ4個でいくつ数えられるでしょうか?
0000(2)~1111(2)までですね。10進数で数えれば、0~15までです。
負数を表現しなくても良い場合には0~15まで数えることが出来ますが、負数を表現するようになるとどう変わるのか、そのあたりも注目してもらえればと思います。
それでは、負数の表現法を習得していきましょう!
負数の表現法
さっそくスイッチ4個で負数を表現する方法を紹介したいと思います。
私の知る限りでは3種類の表現法があります*3ので、それぞれ紹介したいと思います。
ただし、現在のマイコンで実際に使われているのは最後に紹介する『2の補数』と呼ばれる表現法です。古いマイコンではその他の表現法も使われていたようです。
① 符号仮数部
素人がどうやって負数を表現するかを考えたときに、最初に思いつきそうな表現法です。
その表現法とは、符号(+/-)の役割を1番左のスイッチに与えるというものです。
つまり、1番左の数字を『+の時には0』、『-の時には1』として符号を表現します。このような表現法を『符号仮数部(ふごうかすうぶ)表現』と呼びます。
たとえば、+3は0011(2)、-3は0011(2)の一番左を1(-)に置換えて1011(2)とします。
下の表を見てもらえると良く分かりますが、符号仮数部表現の特徴として、表せる数値の範囲は-7~+7です。
また、0の表現が+0:0000(2)と-0:1000(2)の2種類存在します。
なんというか…無駄ですね。
10進数 | 符号仮数部 |
---|---|
+7 | 0111(2) |
+6 | 0110(2) |
+5 | 0101(2) |
+4 | 0100(2) |
+3 | 0011(2) |
+2 | 0010(2) |
+1 | 0001(2) |
+0 | 0000(2) |
-0 | 1000(2) |
-1 | 1001(2) |
-2 | 1010(2) |
-3 | 1011(2) |
-4 | 1100(2) |
-5 | 1101(2) |
-6 | 1110(2) |
-7 | 1111(2) |
② 1の補数
『1の補数(ほすう)表現』は、負の数を表す場合に全てのスイッチを反転させる表現法です。
『反転させる』とは、1を0に、0を1に変換する操作のことです。
たとえば、+3は0011(2)、-3は0011(2)を反転させて1100(2)とします。
先と同様に下の表を見てもらえると良く分かりますが、1の補数表現の特徴として、表せる数値の範囲は-7~+7です。
また、0の表現が+0:0000(2)と-0:1111(2)の2種類存在します。符号仮数部と同じような特徴を持っています。
一番左のスイッチが1であれば必ず負の数なので、符号の判定は容易です。
10進数 | 1の補数 |
---|---|
+7 | 0111(2) |
+6 | 0110(2) |
+5 | 0101(2) |
+4 | 0100(2) |
+3 | 0011(2) |
+2 | 0010(2) |
+1 | 0001(2) |
+0 | 0000(2) |
-0 | 1111(2) |
-1 | 1110(2) |
-2 | 1101(2) |
-3 | 1100(2) |
-4 | 1011(2) |
-5 | 1010(2) |
-6 | 1001(2) |
-7 | 1000(2) |
③ 2の補数
『2の補数(ほすう)表現』は、まず1の補数と同様に全てのスイッチを反転させ、その後1を足す表現法です。
反転させるだけであれば『1の補数』、反転させた後に1を足すと『2の補数』です。
たとえば、+3は0011(2)、-3は0011(2)を反転させた1100(2)に1を足して1101(2)とします。
なんだか先に紹介した2つと比較すると理解しにくい表現法に感じますが、2の補数の良いところは後で解説したいと思います。
ここで、2の補数の面白い特徴を紹介します。
先に紹介した2つの表現法では0の表現は2種類存在することが分かりました。では、2の補数を使って0000(2)の負数を計算するとどうなるか、試してみましょう。
0000(2)を反転すると1111(2)となります。
それに1を足すと、10000(2)となりますが、今は4つのスイッチしかありませんので、はみ出た1*4は無視して下位4桁のみを答えとします。
したがって、0000(2)の2の補数は0000(2)となり変化しません。
つまり、2の補数では0の表現は1種類のみとなります。
下の表を見てもらえると良く分かりますが、2の補数表現の特徴として、表せる数値の範囲は-8~+7です。
また、0の表現は0000(2)の1種類しか存在しません。
先に紹介した2つの表現法と同様に、一番左のスイッチが1であれば必ず負の数なので、符号の判定も容易です。
もう少し後の記事でも解説したいと考えていますが、+7である0111(2)に1を足すと1000(2)となり、いきなり-8まで振り切るので注意したいところです。これも2の補数表現の特徴として押さえておきましょう。
10進数 | 2の補数 |
---|---|
+7 | 0111(2) |
+6 | 0110(2) |
+5 | 0101(2) |
+4 | 0100(2) |
+3 | 0011(2) |
+2 | 0010(2) |
+1 | 0001(2) |
+0 | 0000(2) |
-1 | 1111(2) |
-2 | 1110(2) |
-3 | 1101(2) |
-4 | 1100(2) |
-5 | 1011(2) |
-6 | 1010(2) |
-7 | 1001(2) |
-8 | 1000(2) |
引き算は足し算? ~2の補数の良いトコロ~
実はマイコンが引き算を行うときには、足し算*5を行っています。
たとえば『3 - 2』の計算式は『3 + (-2)』と書けますよね。3という値と-2という値を足し算して引き算を実現しています。
それでは、これまでに紹介した負数の表現法を使用して、この計算を行ってみます。
答えは『1』となって欲しいですがどうでしょうか。
ここからは2進数の筆算を行いますが、計算の仕方は簡単です。
0と0を足せば0、0と1もしくは1と0を足せば1、1と1を足せば1繰り上がって0となります。
では、はりきって計算していきましょう!
符号仮数部
『3 + (-2) = 0011(2) + 1010(2)』
1101(2)は符号仮数部表現では『-5』を表します。
残念ながら、符号仮数部では『1』にはならないようです。
1の補数
『3 + (-2) = 0011(2) + 1101(2)』
桁の溢れが発生していますが、今は4桁で考えていますので、溢れた1は無視して下4桁を答えとします。
0000(2)は『+0』ですね。
残念ながら、1の補数においても『1』にはならない*6ようです。
2の補数
『3 + (-2) = 0011(2) + 1110(2)』
今回も1の補数と同様に桁の溢れが発生していますが、下4桁を答えとします。
0001(2)は『1』ですね。
2の補数で計算した結果のみが正しい答えとなりました!
他の値で計算してみても正しく答えが算出されます。
2の補数を使えば負の値を足し算することで、引き算を実現することが可能です。これが2の補数の良いトコロです。
理解度チェック
この記事の内容をおさらいしておきましょう。
【答えを表示】をクリックすると回答例を表示します。
(1)0101(2)を2の補数で負数に変換してください。
1011(2)
((1011)2、0b1011でもOK!)
0101(2)を反転させて1010(2)、それに1を足して1011(2)です。
(2)2の補数で表された1001(2)を正数(プラスの数)に変換してください。
0111(2)
((0111)2、0b0111でもOK!)
正数 → 負数に変換する手順と全く同じ手順で負数 → 正数に変換できます。
1001(2)を反転させて0110(2)、それに1を足して0111(2)です。
(3)0x55を2の補数で負数に変換し、16進数で答えてください。
0xAB
((AB)16、AB(16)、AB'h、ABh、ABHでもOK!)
0x55は01010101(2)ですね。反転すると10101010(2)、それに1を足して10101011(2)となります。これを16進数に変換して0xABが答えです。
次回はデータの単位について解説します!
/*** このサイトでは脚注を豊富に記載します ***/
*1:スイッチ:bit(びっと)と呼ぶのが正確ですが、簡単のためにスイッチとして紹介しています。
*2:スイッチ4個:4bitと呼ぶのが正確です。bitの話は、次の記事で紹介したいと考えています。
*3:3種類の表現法があります:本当はもう1つ、『ゲタ履き表現』というのもありますが、ここではややこしいので紹介しません。いつか浮動小数点と呼ばれる数値表現を解説することがあれば、『ゲタ履き表現』も紹介したい(紹介せざるを得ない)です。
*4:はみ出た1:計算を行って桁が溢れた1のことをキャリーと呼んだりします。
*5:足し算:マイコン内のCPUには、『加算器』と呼ばれる足し算を行う機構を備えてます。加算器だけで減算ができることを説明しています。
*6:1の補数においても『1』にはならない:実は1の補数においては、溢れた1(キャリー)を最後に足してあげることで正しい答えが出ます。
【C言語(1)】2進数と16進数
C言語学習の最初の記事ですが、この記事ではプログラムコードは出てきません。
まずは基礎固め。プログラマの共通知識を習得しましょう。
最後に問題も用意していますので、理解度の確認に役立ててください。
2進数とは何者か
分かった気になる説明はこれ
私たちが普段数えるときに使っているのは10進数と呼ばれ、『0〜9』の10個の数字で数値を表す方法です。9に1を足すと繰り上がって10(じゅう)となるお馴染みのやつです。
これに対し、2進数とは『0』と『1』の2個の数字だけで数値を表す方法です。1に1を足すと繰り上がって10(いちぜろ)となります。(じゅう)じゃありません。(いちぜろ)です。
その後も順に1を足していくと、
10 → 11 → 100 → 101 → 110 → 111 → 1000 → ・・・
といった具合に増えていきます。
10進数と比較すると次の通りです。
10(2進数) = 2(10進数)
11(2進数) = 3(10進数)
ところで、なんで2進数が必要なの?
大体僕らは10進数で数えることに慣れてるんだし、なんで今さらそんなややこしい数え方すんだよ。
10進数使えば良いじゃん!10進数!
初めて2進数を勉強したときはそう思ってました。
ところが、どうやらマイコンのプログラムを書くのに10進数では都合が悪い時があるということが分かりました。
つまり、『プログラムを書くにあたって、2進数の方が10進数よりも都合が良い場合がある』というのが2進数を必要とする理由です。
マイコンはどうやって動いてる?
突然ですが、マイコンの説明を少し挟ませてください。
マイコンには特定の機能を持った機器*1が多数内蔵されています。詳しくはマイコンの章でお話ししたいと思いますが、簡単に描くとこんな感じです。
プログラムをマイコンに書き込むと、CPUがそのプログラム通りに動いてくれます。
実際にはマイコンに内蔵されているメモリにプログラムが書かれ、CPUがメモリからプログラムを読み出すことで動いています。
このメモリ、実は数十~数百万個のスイッチで構成*4されています。
スイッチにはONとOFFの2つしかありません。
つまりCPUは各スイッチからONかOFFを読み出して動いているわけです。
そのスイッチの組み合わせで数値を表現しています。
例えばスイッチが1つしかなければ、表現できる総数は0(OFF)、1(ON)の2通りです。
スイッチが2つあるのであれば、その組み合わせ総数は00、01、10、11の4通り。10進数でいうところの0、1、2、3です。
スイッチが3つあるのであれば、その組み合わせ総数は000、001、010、011、100、101、110、111の8通りです。10進数でいうところの0、1、2、3、4、5、6、7です。
マイコンのプログラムでは、このスイッチはON(1)にして、このスイッチはOFF(0)にして…と考えることが多いです。
どのスイッチをON(1)にして、どのスイッチをOFF(0)にするのかを考えるのに、2進数の方がダントツで理解しやすいですよね。
これが『2進数の方が10進数よりも都合が良い場合』の説明です。
16進数とは何者か
分かった気になる説明はこれ(2)
16進数は『0~9』の10個の数字と、『A~F』の6個のアルファベットを使って数値を表す表現法です。9に1を足すとAとなり、Aに1を足すとBとなります。そしてFに1を足すと繰り上がって10(いちぜろ)となります。
したがって、16進数の『0~F』は10進数の『0~15』に相当します。
2進数よりもさらに理解し難いヤツが出てきましたね。
2進数では書きません
『プログラムを書くにあたって、2進数の方が10進数よりも都合が良い場合がある』ことは前述のとおりです。
すみません、さっそく訂正させてください。早すぎやろ
正直、私の経験上プログラムで2進数を書くことはありません*5。
圧倒的に16進数もしくは10進数です。
やっぱり数値は10進数の方が理解しやすいので、数値についてはプログラムでも10進数で書きます。
ただ前述のとおり、どのスイッチをON(1)にして、どのスイッチをOFF(0)にするのかは2進数を使って考えます。考えるだけで、2進数では書きません。
16進数を使う理由
組み合わせるスイッチの数は8個だったり16個だったり、32個だったりするのが一般的です。ここは、そんなもんなんだと今は納得していただきたいです。
たとえば16個のスイッチの組み合わせを2進数で書くとどんな感じになるでしょうか。
1001111101011011
こんな感じです。
長い。そして何個目のスイッチが1で、何個目のスイッチが0なのかも分かりにくい。
ってかホントに16個ある?
32個のスイッチなんて書きたくないし、読みたくないし、考えたくもありません。
ここで、次の表を見てください。
この表は2進数、16進数、10進数の比較表です。変換表としても使えますね。
2進数 | 16進数 | 10進数 |
---|---|---|
0
|
0
|
0
|
1
|
1
|
1
|
10
|
2
|
2
|
11
|
3
|
3
|
100
|
4
|
4
|
101
|
5
|
5
|
110
|
6
|
6
|
111
|
7
|
7
|
1000
|
8
|
8
|
1001
|
9
|
9
|
1010
|
A
|
10
|
1011
|
B
|
11
|
1100
|
C
|
12
|
1101
|
D
|
13
|
1110
|
E
|
14
|
1111
|
F
|
15
|
10000
|
10
|
16
|
表の中で、16進数が0〜Fまで一巡すると同時に、2進数の4桁がちょうど一巡している事が分かるでしょうか。
これはつまり、16進数1桁で、2進数4桁を表す事ができるということです。
先ほど羅列した16桁の2進数を16進数に変換してみましょう。
こんなんでしたね。
1001111101011011
4桁ずつに分割します。16個ありましたね…
1001 1111 0101 1011
先の表を見て、16進数に変換します。
9F5B
スッキリしました!
16進数で4桁なので、2進数では16桁であることもすぐに理解できます。
プログラムでは2進数ではなく、この16進数を使って書くことが多いです。
2進数、16進数、10進数の対応は表を見なくても良いように、頭に叩き込んでおきましょう!*6
最初はややこしいですが、慣れれば一瞬で変換可能になります。
進数の表現法
1010 ← コレいくつ?
10進数では1010(せんじゅう)ですね。でも、もしかしたら2進数の1010(いちぜろいちぜろ)かもなぁ。。いやいや、16進数の1010(いちぜろいちぜろ)やろ。
ここで実は8進数*7でしたー、とかいう引っ掛けあるんちゃうん?
・・・・・。汗
10進数しか使ってなければ何も疑問に思いませんでしたが、2進数や16進数などを勉強すると「これは…?」と立ち止まってしまいますよね。
2進数の1010は10進数では10、16進数の1010は10進数では4112です。随分違いますね。
これでは困るので、数値が何進数なのか表現する方法を知っておきましょう。
表現法
10進数
10進数は一般的なので、文書でもプログラムでも普通に数字を書けば10進数という認識です。
ただ、この記事のように他の進数での表記があるなどして、10進数であることを意図的に明示したい場合には次のように表すことが出来ます。
1010(10)
(1010)10
0d1010
10進数は英語でdecimal(デシマル)と呼びます。0d(ぜろでぃー)のdはdecimalの頭文字です。
2進数
2進数を明示する場合には、次のように表すことが出来ます。
1010(2)
(1010)2
0b1010
2進数は英語でbinary(バイナリ)と呼びます。0b(ぜろびー)のbはbinaryの頭文字です。
16進数
16進数を明示する場合には、次のように表すことが出来ます。
1010(16)
(1010)16
1010'h・1010h・1010H
0x1010
16進数は英語でhexadecimal(ヘキサデシマル)と呼びます。hやH、0x(ぜろえっくす)のxはhexadecimalからとられたものです。C言語で16進数を記述する際には0xの表現を使用します。
会話で16進数の数値を話すときには、『16進の1010』や『HEX(へっくす)の1010』などと言うことが個人的には多いです。
16進の~やHEXの~など接頭語を付けた場合に限っては、1010(いちぜろいちぜろ)を間違えて1010(せんじゅう)と言ったとしても雰囲気で伝わります。ただ、接頭語もなしに1010(せんじゅう)と言えば、相手は確実に10進数と誤認識することになります。
理解度チェック
この記事の内容をおさらいしておきましょう。
【答えを表示】をクリックすると回答例を表示します。
(1)0b1101を16進数に変換してください。
0xD
((D)16、D(16)、D'h、Dh、DHでもOK!)
2進数4桁は、16進数1桁で表すことができるのでした。
(2)0xABCDを2進数に変換してください。
0b1010101111001101
((1010101111001101)2、1010101111001101(2)でもOK!)
16進数1桁につき、2進数4桁が変換されます。
16進数1桁ずつ、順番に2進数に変換しましょう。
(3)『0xC + 0b0011 - 5 』の計算式の答えを16進数で答えてください。
0xA
((A)16、A(16)、A'h、Ah、AHでもOK!)
0xCは12(10)、0b0011は3(10)です。
つまり、計算式を全て10進数で書くと『12 + 3 - 5』となり、答えは10(10)です。10(10)は0xAでしたね。
最後の問題で、計算式の答えがマイナスになった時にはどう答えれば良いのでしょうか。
ということで、次回は負数(マイナスの数)の表現法について解説します!
/*** このサイトでは脚注を豊富に記載します ***/
*1:特定の機能を持った機器:マイコンに内蔵されている機器の事を周辺機器と呼ぶ。英語ではperipheral(ペリフェラル)と呼ぶ。
*2:CPU:しーぴーゆー。Central Processing Unit(中央演算処理装置)と訳される。
*4:スイッチで構成:イメージしやすい表現としてスイッチとしている。ホントは数十~数百万個のトランジスタがぎゅっと集積されていて、それぞれのトランジスタのON/OFFを行うことでその1つ1つに電気を溜めたり放出したりして情報の保存が実現されている。
*5:2進数を書くことはありません:書くことは可能です。書かないだけで。
*6:頭に叩き込んでおきましょう!:16進数と10進数の変換は9まで一緒だしA以降は頑張ってください。Aが10、Cが12、Fが15とこれだけでも覚えておくと楽です。2進数と10進数の変換は、2進数の桁が何を表すかを知っておくと簡単です。下から1桁目は1、2桁目は2、3桁目は4、4桁目は8です。つまり1001だと8+1=9、1100なら8+4=12、0111なら4+2+1=7といった感じです。2進数と16進数の変換は、9までは10進数と同じです。A以降は形で覚えておくと楽です。交互に1010だったらA、それに1足された1011ならB。上2つが1の1100だったらC、それに1足された1101ならD。上3つが1の1110だったらE、全部1ならF。と言った具合です。
*7:8進数:0〜7までの8個の数字を使った表現。2進数の3桁を表すことができるため、16進数と同様に2進数との相性が良い。使った覚えはない。
【初心者向け(2)】組込みエンジニアへのロードマップ
組込みエンジニアに必要なスキルとは
組込みエンジニアに必須のスキルは以下の2つだと考えています。
組込みエンジニアはそれぞれに強みを持って活躍していると思います。
例えば通信*1に強いエンジニア、計測*2に強いエンジニア、自動制御*3に強いエンジニア、画像・映像処理*4に強いエンジニア、etc…
ただ、共通して必須のスキルがC言語です。
趣味で電子工作を楽しむ分には、他のプログラム言語でマイコンを制御する事は可能ですが、業務として過去に作られた製品の保守や、他人が書いたコードを参考にする場合など、必ずと言って良いほどC言語に出会うこととなります。
また、組込みエンジニアはマイコンにプログラムを書き込んで機器を思い通りに制御するため、マイコンの知識が必要なことは想像できるかと思います。
そもそもマイコンとはどんなものなのか、どんな機能があるのか、どうすれば制御できるのか、それらを理解してプログラムを作製すれば思った通りにマイコンは動いてくれます。
以上のとおり、C言語などのプログラム言語とマイコンの知識を習得すれば組込みエンジニアとしては一応成立すると考えています。
一応というのは、組込みエンジニアとして活躍できるレベルにはあるけど、そのスキルだけだと後々困ることになると思うからです。
何故困ることになるのかを説明しましょう。
組込み開発の手順
いきなり実践的ですが、組込み開発の流れは図のような手順となります。
設計はどんな物をどの様に作るのかを決定する段階です。
一般的にはユーザー(お客さんとか自分)が求めているものはどんな物なのかを洗い出し、それを実現するために必要な機能は何かを検討し、そしてその機能はどの様に実現するかを考えるといった手順となります。
どの様に実現するかを考えるところでC言語とマイコンの知識が役に立ちます。
この設計段階で抜けがあると、後になって「あっ、あの機能も必要だった…」と手戻りが発生し、開発時間が無駄に伸びます。
コーディングは先ほどの設計に基づいて実際にプログラムコードを書く段階です。
いかに不具合を少なくして機能を実現するのかが腕の見せ所となります。
また、他人にも読みやすく理解しやすいコードを書くことで、後の製品保守*5や次の開発へ流用*6がしやすくなります。
正直、自分が書いたコードであっても何をやっているコードなのかすぐに忘れるので、理解しやすいコードを書くことは大事です。
そして最後に、テストはコーディングしたプログラムが正しく動くか、必要な機能が実現されて求めていた物が出来上がっているかを確認する段階です。
プログラムが正しく動くかを確認することをデバッグ*7とも呼びます。
テストにもC言語とマイコンの知識が必要となりますが、その知識しか持ち合わせていないとここで壁にぶつかる事になります。
不具合の原因はソフトウェアだけではない
テストで不具合に出会ったとき、「プログラムが思ったように動かない…何故だ…??」となるわけですが、不具合の原因を見つけるためにプログラムコードだけを眺めていても解決できない事が多々あります。
何故なら、不具合の原因がソフトウェア*8ではなくハードウェア*9に起因している場合もあるからです。
例えば、マイコンで温度の測定を行う機能のデバッグ中、温度の測定値が高くなったり低くなったりを繰り返し、大きく振れているとします。
温度の測定値が大きく振れていては一体今何度なのかが分からず困ります。
この測定値が大きく振れる原因は何でしょうか。
ざっと次のようなことが考えられます。
- プログラムコードの処理にバグがあり、プログラムの計算結果が大きく振れている。
- そもそも測定している温度が本当に大きく振れている。
- 測定している温度にノイズが混入しており、ノイズを含んで測定した結果大きく振れた測定値となっている。
1~3番目までが複合している可能性もありますが、3番目についてはプログラムが正しく動いていても、測定値にノイズが乗っているために温度が正しく測れない状態です。
ソフトウェアでノイズを除去することも可能ですが、基本的にはハードウェアでノイズを除去することが望ましいです。(この理由についてはまた記事にしたいと考えています。)
では、ハードウェアでノイズを除去するにはどうすればいいのか…?
ここまで長々と説明してしまいましたが、つまりハードウェア(電子回路・部品)の知識も組込みエンジニアには必要だと言いたいのです。
不具合に出会ったとき、まずはその原因がソフトウェアにあるのか、それともハードウェアにあるのかを切り分ける必要があります。
原因を切り分けるためにもハードウェアのスキルを身につけておく方が望ましいです。
上記のようなハードウェアに起因した不具合の例は日常的に本当によくある話です。
したがって、このサイトではマイコン周辺の電子回路についても説明していきたいと考えています。
具体的なロードマップ
このサイトでは大きなステージを3つ設定します。
Stage1.C言語
Stage2.マイコン
Stage3.周辺電子回路
そして、その大きなステージの中に小さなステージをいくつか用意します。
ステージ毎に記事にしますので、継続してステージをクリアすることで組込みエンジニアとしてのスキルを一つ一つ習得してもらえる仕組みを考えています。
今考えているC言語のステージ一覧(スキルリスト)は下のとおりです。もしかすると、必要に応じて増やすかもしれません。
マイコンや周辺電子回路についても同じように基礎からスキルを習得できるようにスキルリストを設定して記事を更新していきます。
今はスキルリストの内容が「何言ってるの?全然分からん!」で大丈夫です。これから1つ1つ丁寧に説明していきます。
1つのステージをクリアするたびに、あなたは組込みエンジニアのスキルを1つ手に入れるわけです。まるで少しずつ呪文を覚えて立派な魔法使いになるように。
自身のレベルアップを実感しながら取り組んでもらえると楽しく継続できるのではないでしょうか。
/*** このサイトでは脚注を豊富に記載します ***/
*1:通信:機器と機器との間で情報のやり取りをすること。USBとかBluetoothとか。
*2:計測:温度、加速度、電流、電圧、etc…を測ること。
*3:自動制御:人が設定した目標値に合うようにマイコンが勝手に制御してくれること。モータの回転角度・速度とか温度調節とか。
*4:画像・映像処理:ディスプレイに文字や画像を表示させること。
*5:製品保守:製品に新機能を追加したり、後になって発見された不具合の修正などを行うこと。
*6:次の開発へ流用:時間とお金をかけて開発した技術はそのまま次の開発に流用すると効率が良い。流用した技術の上にさらに時間とお金をかけて開発を行うことを繰り返すと技術が成長する。
*7:デバッグ:プログラムの不具合をバグという。見つかっているバグの調査や修正、バグがないことの確認をデバッグという。なぜプログラムの不具合をバグと呼ぶのか気になるが、昔アメリカで本当に虫(バグ)が原因でコンピュータがバグったという逸話が…
*8:ソフトウェア:プログラムなどの物理的に目に見えないもののこと。
*9:ハードウェア:電子回路や電子部品などの物理的に目に見えるもののこと。
【初心者向け(1)】組込みエンジニアになろう
※この記事は組込みエンジニアになりたい方、興味がある方、また組込みエンジニアの教育に困っている方に向けて書いています。
組込みエンジニアを増やしたい
「組込みエンジニアって少なくない?」
私が組込みエンジニアとしてのキャリアを歩むなかで感じていることです。
組込みエンジニアとは簡単に言うと、家電・産業機器・自動車などを制御するマイコン*1を操る人です。製品の仕様決めから電子回路設計も含むと思います。
と言う私も社会人になるまでは「組込み」という言葉を知りませんでした。それどころか、プログラムというものを作ったことすらありませんでした。
それがいつの間にか組込みエンジニアとして飯を食べる事になったのです。
何も分からないところから組込みエンジニアになるまではちょっとだけ苦労しましたが、振り返るとそんなに難しい事はしてこなかったように思います。
私がこれまでにやってきた軌跡を辿るように知識を紹介すれば、今は素人だけど組込みエンジニアを目指している方の力になれるのではないか。
何から手を付けたらいいのか分からず立ち止まっている方の背中を押すことが出来るのではないか。組込みエンジニアがわずかでも増えるのではないか。
そう思い立ってこのサイトを開設しました。
まずはC言語の習得から
私自身まだまだ組込みエンジニア歴は浅いですが、まだ素人だった頃の気持ちを覚えている間に発信することが大切だと考えました。
自分のつまづいたところを丁寧に紹介することが出来るからです。
組込みスキルは幅広いですが、私は素人であっても最低限の実務に耐えうるレベル*2までは短期間で達成できると考えています。短期間とは言っても1回2時間、週3回のペースで半年くらいかなと思いますが。
今考えている内容としては、まずは何と言ってもC言語の習得からです。
多くの組込みシステムはC言語を用いて作られています。
他のプログラム言語を使用した組込みシステムもあると思いますが、それでも過去のソフトウェア保守*3を行う上では必ずと言って良いほどC言語に関わることになります。
C言語がある程度使えるレベルになったところで、実際にマイコンを使用した実践的な内容を紹介したいと考えています。
趣味で電子工作
電子工作に興味がある方ってどれだけいるのでしょうか。
実は結構いるんじゃないかなーという気がします。
私自身は色々作れたら楽しいだろうなぁ…と思っています。正直言うと私もそんなに作った経験は無いのです。
あるにはあるのですが良く分からないままに勢いで作ったっきりです。
勢いで作った割には実用的でしたが。どんな物を作ったかは、またいつか記事にしたいと思います。今ならもう少しマシなものが出来上がりそうだなー
このサイトでは組込みスキルの一部として、電子回路の知識も紹介する予定です。
電子回路の知識を身に付けると、電子工作が可能になります。
マイコンを操れるようになると、出来ることの幅が大きく広がるので、更に上級の電子工作が楽しめるようになると思います。
ただし…電子工作はスキルがあってもアイデアと格好良く作れるセンスが別に必要だと思います。
私のまわりにもスキルはあるのに「何作ろうかな。。」で立ち止まっているエンジニアがいます。
私もせっかくなのでこのサイトの更新を通して、最後にはいろんな電子工作にチャレンジしてみたいと考えています。
組込みシステムは外注?
多くのメーカーが組込みシステムを内蔵した製品を作っているわけですが、実情は組込みソフトウェア*4、ハードウェア*5を専門の会社に外注して作る会社も多いかと思います。
『それじゃ、組込みエンジニアの活躍の場は少ないのかな…』
いや、そんな事はないと思うのです。
組込みシステムは実現する機能が多いほど複雑になりがちです。複雑になると当然トラブルが発生しやすくなります。
突発的なトラブルが生じたときにすぐに対応できる機動力を確保するためには、社内に組込みエンジニアを抱えるほうが安心ではないですか。
実際に求人情報を見てみても、多くの会社が組込みエンジニアを求めている事が分かると思います。
つまり、組込みスキルを習得することは就職、転職に有利に働くし、その間口も広いと思います。転職を勧めているわけではないです…
最後に
近頃はIoT*6やAI*7なんて言葉をホントよく聞きますね。
これらはまさに組込みエンジニアが求められる領域です。
IoTはモノの中にセンサや通信の機能を組込んで実現します。
今後ますます組込みエンジニアの需要は高まりそうです。
AIの開発にはPython*8というプログラム言語が使用されることが多いですが、組込みスキルの学習を足掛かりにしてAI人材を目指すことも可能だと思います。
組込みスキルを持ったAIエンジニア、かっこいいですね!
プログラム言語を1つ習得すると別のプログラム言語の習得も少し楽になります。
まずはC言語を習得しましょう!
最初からAIエンジニアを目指すんだ!という方はPythonから学習するのが近道だと思います。。
これからC言語、システム設計、マイコン、周辺電子回路などの知識を発信していきたいと思っています。少しでも多くの方の役に立てば幸いです。
次回はどのようなロードマップで組込みエンジニアを目指すのかをお話ししたいと思います。
/*** このサイトでは脚注を豊富に記載します ***/
*1:マイコン:マイクロコントローラ。プログラムを書き込んで、機器を思い通りに動かせる。
*2:最低限の実務に耐えうるレベル:機能の仕様に沿ったプログラムを考えて書き、プログラムをテストできる。過去のエンジニアが書いたプログラムを理解できる。
*3:ソフトウェア保守:新機能の追加や不具合への対応などを行うこと。
*4:ソフトウェア:プログラムや機能などの物理的に目に見えないもの。
*5:ハードウェア:電子部品・回路などの物理的に目に見えるもの。
*6:IoT:あいおーてぃー。Internet of Things(モノのインターネット)と訳される。あらゆるモノがインターネットに繋がること。遠隔でモノの状態が分かったり、制御できたりして便利な世の中になる。モノ同士が会話できたりもする。
*7:AI:えーあい。Artificial Intelligence(人工知能)と訳される。自分で考えてくれるので賢い。だけど結局のところプログラムに従って動いているだけなので、言葉や感情は本当の意味では理解していない。
*8:ぱいそん。