C言語には、様々な値を扱うための型があります。
それらの型について復習をするとともに、説明していなかった部分を説明します。
型
C言語には、整数や小数、文字列を扱うために、それぞれに合った型を使う必要があります。
ここに、型と用途をまとめておきます。
型 | 用途 |
---|---|
int | 整数 |
double | 小数・実数 |
char | 文字・整数 |
文字列は char型の配列で表現するため、char型は文字を表すことになりますが、整数を表すことも可能です。
整数を表すものとして、int型もありますが、int型と char型の違いは、表せられる数字の範囲です。
型の範囲
全ての型には、表せられる数字の範囲があります。
範囲は、実行するコンピュータによって変わることがありますが、ほとんどの場合、このような範囲になっています。
型 | 範囲 |
---|---|
int | -2147483648 〜 2147483647 |
double | ±10^(-307) ~ ±10^(308) |
char | -127 〜 128 |
double型の「^」は累乗を表します。 なぜ、このような範囲になっているのかは説明しませんが、ほとんどのコンピュータではこのような型の範囲になります。
符号
普段と同じように変数を作ろうとすると、マイナスからプラスの範囲で数字を扱えます。
しかし、マイナスの範囲の数字を使わないということであれば、プラスの範囲をさらに拡大して使うことが可能です。
そこで、型にはマイナスも扱える「符号付き」とプラスしか扱えない「符号なし」を選ぶことができます。
符号付きの変数を作りたい場合は「signed」、符号なしの変数を作りたい場合は「unsigned」を型の前につけて、変数を作ります。
#include <stdio.h>
int main(void)
{
unsigned int a;
signed int b;
unsigned char c;
signed char d
return 0;
}
double型に関しては、符号に関する設定ができないため、使うことができません。
普通は、signed はなくても符号付きになるため、signed をつけなくても構いません。
符号なしの場合の型の範囲はこのようになります。
さらに、unsigned では、scanf関数や printf関数の変換指定子が変わります。
型 | 範囲 | printf関数 | scanf関数 |
---|---|---|---|
unsigned int | 0 〜 4294967295 | %u | %u |
unsigned char | 0 〜 255 | %u | %u |
他の型
整数や小数を扱うための型は、int型や double型の他にもあります。
型 | 用途 | 範囲 | printf関数 | scanf関数 |
---|---|---|---|---|
short | 整数 | -32768 〜 32767 | %d | %d |
long long | 整数 | -2147483648 〜 2147483647 | %lld | %lld |
float | 小数・実数 | ±10^(-37) ~ ±10^(38) | %f | %f |
float型は、double型よりも狭い範囲の小数を扱うための型です。
short型や long long 型は、int型よりも小さいまたは大きい範囲の整数を扱うための型です。
これらの型についても、コンピュータによっては、型の範囲が、異なる場合があります。
オーバーフロー
これらの型の範囲を超える値を扱った場合、どのようになるのか見てみます。
#include <stdio.h>
int main(void)
{
char a;
int i;
a = 0;
for (i = 0; a <= 128; i++) {
a += 1;
printf("%d\n", a);
}
return 0;
}
char型は127までの値を扱うことしかできないので、変数a は128になることはなく、127に1を足した128を代入した場合に、-128が代入されます。
なぜ、このように127の次に-128が代入されたかは説明しませんが、このように型の範囲の最大値や最小値を超えることを「オーバーフロー」と言います。
まとめ
全ての型には、扱うことができる値の範囲があります。
プログラミングをするときは、これらの範囲に気をつけて、オーバーフローやアンダーフローが起こさないように気をつけましょう。