CentOS 6.4(64ビット版)でC言語を使用した場合のint型の最大値と最小値
CentOS 6.4の64ビット版でC言語を使用した場合のint型の最大値と最小値を知りたくなったので、確認をしてみた。
CentOS 6.4が64ビット版であることを確認する
[root@test test]# uname -a
Linux test.centos6 2.6.32-358.el6.x86_64 #1 SMP Fri Feb 22 00:31:26 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
「x86_64」という結果が返っているので、64ビット版であることを確認できる。
Cライブラリの<limits.h>で用意されているマクロ(Macro)を使用し、最大値、最小値を確認する。
※<limits.h>にどのようなマクロがあるかについては、以下のサイトを参考にした。
C <limits.h> Library - tutorialspoint SIMPLY EASY LEARNING
http://www.tutorialspoint.com/c_standard_library/limits_h.htm
このサイトを参考にしながら、test.cというソースファイルを作成する。
《test.cのソースファイル》
#include <stdio.h>
#include <limits.h>
void main(void){
printf("CHAR_BIT:%d\n",CHAR_BIT);
printf("SCHAR_MIN:%d\n",SCHAR_MIN);
printf("SCHAR_MAX:%d\n",SCHAR_MAX);
printf("UCHAR_MAX:%d\n",UCHAR_MAX);
printf("CHAR_MIN:%d\n",CHAR_MIN);
printf("CHAR_MAX:%d\n",CHAR_MAX);
printf("MB_LEN_MAX:%d\n",MB_LEN_MAX);
printf("SHRT_MIN:%d\n",SHRT_MIN);
printf("SHRT_MAX:%d\n",SHRT_MAX);
printf("USHRT_MAX:%d\n",USHRT_MAX);
printf("INT_MIN:%d\n",INT_MIN);
printf("INT_MAX:%d\n",INT_MAX);
printf("UINT_MAX:%d\n",UINT_MAX);
printf("LONG_MIN:%d\n",LONG_MIN);
printf("LONG_MAX:%d\n",LONG_MAX);
printf("ULONG_MAX:%d\n",ULONG_MAX);
}
gccコマンドでソースファイルをコンパイル後、プログラムを実行する。
《実行結果》
CHAR_BIT:8
SCHAR_MIN:-128
SCHAR_MAX:127
UCHAR_MAX:255
CHAR_MIN:-128
CHAR_MAX:127
MB_LEN_MAX:16
SHRT_MIN:-32768
SHRT_MAX:32767
USHRT_MAX:65535
INT_MIN:-2147483648
INT_MAX:2147483647
UINT_MAX:-1
LONG_MIN:0
LONG_MAX:-1
ULONG_MAX:-1
これで、CentOS 6.4(64ビット版)でC言語を使用した場合、int型の最小値は-2147483648、最大値は2147483647であることが分かった。
ここで、何となく気になって、最大値を超える値を変数に代入するとどうなるかを実験してみることにした。
int型変数の最大値「2147483647」を代入した場合
《test.cのソースファイル》
#include <stdio.h>
void main(void){
int i;
i = 2147483647;
printf("%d",i);
}
《実行結果》
2147483647
⇒この結果は問題ない。
int型変数の最大値「2147483647」に1を加えた「2147483648」を代入した場合
《test.cのソースファイル》
#include <stdio.h>
void main(void){
int i;
i = 2147483648;
printf("%d",i);
}
《実行結果》
-2147483648
⇒int型変数の最大値に1を加えた値「2147483648」を変数に代入すると、int型変数の最小値と同じ値になることが分かる。
int型変数の最大値「2147483647」に2を加えた「2147483649」を代入した場合
《test.cのソースファイル》
#include <stdio.h>
void main(void){
int i;
i = 2147483649;
printf("%d",i);
}
《実行結果》
-2147483647
⇒int型変数の最大値に2を加えた値「2147483649」を変数に代入すると、int型変数の最小値よりも1大きい値になることが分かる。
int型変数の最大値「2147483647」に最大値と同じ「2147483647」を加えた「4294967294」を代入した(最大値の2倍の値を代入した)場合
《test.cのソースファイル》
#include <stdio.h>
void main(void){
int i;
i = 4294967294;
printf("%d",i);
}
《実行結果》
-2
⇒int型変数の最大値を2倍にした値「4294967294」を変数に代入すると、-2になることが分かる。
int型変数の最大値「2147483647」を2倍にし、1を加えた値「4294967295」を代入した場合
《test.cのソースファイル》
#include <stdio.h>
void main(void){
int i;
i = 4294967295;
printf("%d",i);
}
《実行結果》
-1
⇒int型変数の最大値を2倍にし、1を加えた値「4294967295」を変数に代入すると、-1になることが分かる。
int型変数の最大値「2147483647」を2倍にし、2を加えた値「4294967296」を代入した場合
《test.cのソースファイル》
#include <stdio.h>
void main(void){
int i;
i = 4294967296;
printf("%d",i);
}
このソースをgccコマンドでコンパイルしようとすると、エラーになった。
[root@test test]# gcc test.c
test.c: In function ‘main’:
test.c:5: 警告: 暗黙の定数変換でオーバーフローしました
⇒int型変数の最大値を2倍にし、2を加えた値「4294967296」を変数に代入すると、0になるのかな、と思ってソースを書いたが、コンパイルエラーとなってしまい、そもそも実行できるプログラムとならなかった。
最大値と同様に、最小値も実験してみる。
int型変数の最小値「-2147483648」を代入した場合
《test.cのソースファイル》
#include <stdio.h>
void main(void){
int i;
i=-2147483648;
printf("%d",i);
}
《実行結果》
-2147483648
⇒この結果は問題ない。
int型変数の最小値「-2147483648」より1を引いた値を代入した場合
《test.cのソースファイル》
#include <stdio.h>
void main(void){
int i;
printf("%d",-2147483649);
}
このソースをgccコマンドでコンパイルしようとすると、エラーになった。
[root@test test]# gcc test.c
test.c: In function ‘main’:
test.c:5: 警告: 暗黙の定数変換でオーバーフローしました
最大値の場合は「最大値の2倍+2」の値でコンパイルエラーとなるが、最小値の場合は「最小値-1」の値でコンパイルエラーとなることが分かった。
最小値の場合はプログラミングミスを気にする必要性が低そうだが、最大値の場合は、最大値よりも大きな値が変数に代入されると、最小値を基点とした負の値に変わるようなので、プログラミング時には注意が必要だと思った。