『Cプログラミングの落とし穴』(A.コーニグ, 1990)
[M1 Mac, Big Sur 11.7.2, clang 13.0.0, NO IDE]
intの最大値付近が16進数ではどうなっているのか調べました。
intの最大値2147483647の16進数での次の値は10進数では-2147483648となっていて1ずつ増えていき最後に-1になります。この値の次がintの範囲を超えた数値になります。
4バイトをあてがったintの最大値は(2^8)^4/2 -1=2147483647のように算出できます。
int int_max_m1, int_max, int_max_p1, int_m1, int_m1_p1;
long long_m1_p1, long_A;
int main() {
int_max_m1= 2147483646; // intの最大値 -1
int_max = 2147483647; // intの最大値
int_max_p1 = 2147483648; // intの最大値 +1
int_m1 = -1;
int_m1_p1 = 0x100000000; // int最大値の次の値 int
long_m1_p1 = 0x100000000; // int最大値の次の値 long
long_A = 4294967295; // int:-1
printf("10進数\n");
printf("int_max_m1 : %d\n", int_max_m1);
printf("int_max : %d\n", int_max);
printf("int_max_p1 : %d\n", int_max_p1);
printf("int_m1 : %d\n", int_m1);
printf("int_m1_p1 : %d\n", int_m1_p1);
printf("long_m1_p1 : %ld\n", long_m1_p1);
printf("long_A : %ld\n", long_A);
printf("16進数\n");
printf("int_max_m1 : %x\n", int_max_m1);
printf("int_max : %x\n", int_max);
printf("int_max_p1 : %x\n", int_max_p1);
printf("int_m1 : %x\n", int_m1);
printf("int_m1_p1 : %x\n", int_m1_p1);
printf("long_m1_p1 : %lx\n", long_m1_p1);
printf("long_A : %lx\n", long_A);
return 0;
}
10進数
int_max_m1 : 2147483646
int_max : 2147483647
int_max_p1 : -2147483648
int_m1 : -1
int_m1_p1 : 0
long_m1_p1 : 4294967296
long_A : 4294967295
16進数
int_max_m1 : 7ffffffe
int_max : 7fffffff
int_max_p1 : 80000000
int_m1 : ffffffff
int_m1_p1 : 0
long_m1_p1 : 100000000
long_A : ffffffff