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 int0 〜 4294967295%u%u
unsigned char0 〜 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が代入されたかは説明しませんが、このように型の範囲の最大値や最小値を超えることを「オーバーフロー」と言います。

まとめ

全ての型には、扱うことができる値の範囲があります。

プログラミングをするときは、これらの範囲に気をつけて、オーバーフローやアンダーフローが起こさないように気をつけましょう。