int 型变量在内存中占4个字节,这在以前已经用 sizeof 函数测试过。现在做更加细化的测试:
#include <iostream>
using namespace std;
int main(){
cout << (1 << 31);
return 0;
}
测试结果:
经验算,-2147483648正好是“负2的31次方”。实际上,在4个字节、32个比特位中,只有最左端的第31位(最右端为第0位)是1,其余全都是0 。为了验证这个猜想,代码作如下修改:
#include <iostream>
using namespace std;
int main(){
cout << ((1 << 31) & 2147483647);
return 0;
}
测试结果:
2147483647是2的31次方减1,在32个比特位中,除了最左端的第31位是0,其余31个比特位(从第0位到第30位)全都是1,按位相与以后,正好是0.
当代码写成1左移32位时,编译器报错:
#include <iostream>
using namespace std;
int main(){
cout << (1 << 32);//[Warning] left shift count >= width of type
return 0;
}
表示越界了。由此可断定:int型最右端的第31位,即最高位,其实是符号位,该位置1、其余位全0时,为int型能表示的负值的最大值 -2147483648。绝对值再大的负数就溢出了。验证代码如下:
#include <iostream>
using namespace std;
int main(){
int i = -2147483649;//[Warning] overflow in implicit constant conversion [-Woverflow]
cout << i;
return 0;
}
而当最高位置0、其余位全1时,为int型能表示的正数的最大值 2147483647 。若试图表示正数2147483648,则会自动变成 - 2147483648 。验证代码如下:
#include <iostream>
using namespace std;
int main(){
int i = 2147483648;
cout << i;
return 0;
}
i 减一个1 以后就正常了:
#include <iostream>
using namespace std;
int main(){
int i = 2147483647;
cout << i;
return 0;
}
由此可得结论:
1,int型在Dev C++ 5.11编译器环境下,占4个字节、32个比特位的内存;
2,int型最高位是符号位,1表示负数,0表示正数;
3,int型变量的表示范围为: - 2147483648 ~ + 2147483647 。
=============================分割线=================================
得到 int 型正数最大值的方法:对负数最大值按位取反:
#include <iostream>
using namespace std;
int main(){
cout << ~(1 << 31);
return 0;
}