5.2 変数の種類
変数には型があると解説しましたが、その種類をご紹介したいと思います。
これまでは、int型が主でしたが実際の設計時に使用することもあるので、覚えておいてください。
| 型名 | 内容 |
| char | 文字を格納する型 概ねのコンパイラでは1byteとして扱われる |
| short | 数値を格納する型 概ねのコンパイラでは2byteとして扱われる |
| int | 数値を格納する型 概ねのコンパイラでは4byteとして扱われる |
| long | 数値を格納する型 概ねのコンパイラでは4byteとして扱われる |
| float | 小数を格納する型 概ねのコンパイラでは4byteとして扱われる 有効桁数が約7桁 |
| double | 小数を格納する型 概ねのコンパイラでは8byteとして扱われる 有効桁数が約15~16桁 |
int型とshort型はどちらも数値を扱う型になります。
サイズが4byteと2byteで違いがありますが、扱う数値の範囲が異なります。
int型は、-2,147,483,648 ~ 2,147,483,647の範囲の数値が処理できます。
short型は、 -32,768 ~ 32,767の範囲の数値が処理できます。
演算結果を格納する際に、short型では範囲が収まらない場合はint型で格納することになります。
大は小を兼ねるとして、何でもint型で宣言をして変数を扱うことでよいのでは?と思うかもしれませんが、マイコンはメモリ容量が有限です。
4byteサイズのint型より、2byte型のshort型の方がメモリ容量は半分で済みます。
違う表現をしますと、int型の変数を1つ用意するのと、short型の変数を2つ用意するのは等価です。
つまり、扱いたい変数の数が多くなる様な制御プログラムの場合はできるだけサイズの小さい型を使う方が賢明となります。
とは言え、扱いたい数値範囲が収まらない型を使うわけにはいきませんので、数値範囲とメモリサイズの兼ね合いを見ながら設計していくことになります。
以下は混乱を招くかもしれませんが、C言語の曖昧さの一つなので覚えておいてください。
char型は文字を格納する型である。と解説しましたが、実際には数値を格納することが可能です。
文字データを格納する際にも利用するのですが、-128~128で収まる数値範囲の場合はchar型の変数を宣言してメモリ容量を抑えて設計するのが、通常のマイコンプログラミングになります。
大抵は以下の優先順で変数を扱うのが一般的になります。
最優先で使いたい・・・char型 -128~128127
数値範囲が大きくなるなら2番手の候補で使いたい・・・short型 -32,768 ~ 32,767
それ以上の数値範囲で使いたい・・・int型、long型
少数値を扱いたい・・・float型、double型
符号付き・符号なしの型宣言
型には符号付きと符号なしがあります。
上記の表で記載している型は、符号付きになります。
符号とは、マイナスの値を扱うか扱わないか。という意味です。
符号なし・・・マイナスの範囲は扱わない
符号付き・・・マイナスの範囲を扱う
符号なしの宣言方法・・・unsigned を型名の前に付ける
符号付きの宣言方法・・・型名の前には何もつけない。
例を用いて解説してみましょう。
符号なしの型は以下の様に宣言します。
unsigned char
unsigned short
unsigned int
unsigned long
符号ありの方は以下の様に宣言します。
これまで宣言していた変数は、符号ありの宣言ということです。
char
short
int
long
符号なしの型として宣言された変数は、マイナスの値を扱うことができません。
扱える数値範囲は以下となります。
unsigned char 0~255
unsigned short 0~32,767
unsigned int 0~4,294,967,295
unsigned long 0~4,294,967,295
符号は、最上位のbitが符号ビットになります。
例を挙げてみましょう。
char型は1byteのサイズだと説明しました。2進数で記載すると以下になります。
bit 8765 4321
2進数の値 0000 0000
8bit目の最上位が符号bitとなり、符号付きとして宣言する場合、2進数の値が1ならマイナス、0ならプラスの数値範囲を表現していることを意味します。
[マイナス範囲]
bit 8765 4321
2進数の値 1000 0000
[プラス範囲]
bit 8765 4321
2進数の値 0000 0000
符号付き・・・char型の場合、1byteサイズなので-128~128127が扱える数値範囲と解説しました。
符号なし・・・unsigned char型の場合、0~255が扱える数値範囲と解説しました。
どちらも最大扱える数値範囲が、256であることは変わりません。
以下、2進数の値とbit数の関係で見ると、符号なしの8bit目が1となった場合、2の7乗なので10進数で128という値になります。
符号付きの8bit目は符号ビットであると解説しましたので、同じく2の7乗なので10進数で128という値になり、マイナスの符号をつけて-128となります。
bit 8765 4321
2進数の値 1000 0000
範囲外の値を格納した場合の振る舞いについては、処理系に依存します。
「処理系に依存」というのは、扱っている開発媒体のツールによる。というものです。
その上で、1byteのchar型に対して範囲外の値を入れた場合の事例をご紹介します。
符号なしのunsigned char型・・・0~255の範囲だが、256を格納すると0として処理されますので、変数の中身は0が格納されます。
符号付きのchar型・・・-128~128127の範囲だが、-129を格納すると127として処理されることが多いです。
マイナスではなくプラスの値として扱われることになるので注意が必要です。
何故、プラスの値になるのか?は、2進数の値とbit数の関係で解説した内容に戻りますが、符号ビットが0になって処理されるからです。