Shammer's Philosophy

My private adversaria

C言語・変数の最大値を超えた場合は?

以下のように、宣言した変数の最大値を超えるような計算をした場合、その変数は最小値に戻るようだ。

#include <stdio.h>
#include <limits.h>

int main(int argc, char * args[]){
    int value = INT_MAX;
    printf("value = %d\n", value);
    printf("value = value + 1\n");
    value = value + 1;
    printf("value = %d\n", value);
    return 0;
}

この実行結果は以下。

$ ./a.out
value = 2147483647
value = value + 1
value = -2147483648

次は、unsigned な変数の例。

#include <stdio.h>
#include <limits.h>

int main(int argc, char * args[]){
    unsigned int value = UINT_MAX;
    printf("value = %u\n", value);
    printf("value = value + 1\n");
    value = value + 1;
    printf("value = %u\n", value);
    return 0;
}

実行結果は以下。

$ ./a.out
value = 4294967295
value = value + 1
value = 0

unsigned の計算やってみたとき、間違えて unsigned int value = INT_MAX としてしまったが、
この場合は unsigned なしと同じ結果になった。変数の型宣言はあまり厳密じゃなさそう。char を int で扱おうとしても意図した結果になるかはさておき、処理はできてしまったりもするので、C という言語はそういうものなんだろう。プリミティブ型については結構ルーズなのか、、、