众所周知,在32位系统中,int型变量占4字节,表示范围为(-2^31)~(2^31-1),也即(-2147483648)~(2147483647)。下面直接上代码说明有趣发现是什么:
#include <stdio.h> int main() { int a1 = 2147483647; // 超出int型所能表示的最大正整数 int a2 = 2147483648; // 刚好超出int型所能表示的最大正整数 int a3 = 2147483649; // 超出2个单位 int a4 = 2147483648*2; // 2147483648偶数倍 int a5 = 2147483648*3; // 2147483648奇数倍 int a6 = 2147483648*2+3; // 偶数倍 + 3 int a7 = 2147483648*3+3; // 奇数倍 + 3 printf(" a1..%d\n a2..%d\n a3..%d\n\n a4..%d\n a5..%d\n a6..%d\n a7..%d\n", a1, a2, a3, a4, a5, a6, a7); return 0; }
输出:
a1..2147483647 a2..-2147483648 a3..-2147483647 a4..0 a5..-2147483648 a6..3 a7..-2147483645
结果分析:
2147483647=(011...11),-2147483648=(100...00)
1. int型的表示形式是一个循环:最大正整数加1就会变成最小负整数,以此类推;
2.最小负整数-2147483648乘以2,则相当于(100...00)和(100...00)作加运算,进位1但无法表示,故结果为(000..00)也即0。