今天写了一个程序要用到int型的最大最小值,一时想不起来怎么实现,隐约记得用位运算可以实现但是自己试了好几个都不对,似乎什么取反加一规则在这里失效了。后来上网查了一下才知道是系统处理带符号数的取反运算时“有他自己的一套方法”。要把有符号数先转成无符号数再进行取反操作。下面是取得int型变量能存放的最大最小值的方法。
#include<iostream>
using namespace std;
int main()
{
cout<<"IntMax="<<int(~((unsigned int)0)>>1)<<endl;
cout<<"IntMin="<<~((int)(~((unsigned int)0)>>1))<<endl;
return 0;
}
为了方便起见用00000来代表int型的0的二进制表示:
首先定义一个无符号整型的0:00000
取反:11111
右移一位:01111
转成int型即得到正的最大值
依然是无符号的0:00000
取反:11111
右移一位:01111
装换成有符号数再取反:110000(注意这里:系统对有符号数的取反过程实际上是先改变且只改变符号位,然后再直接加1)
然后就得到了int型的最小值
而事实上系统已经将这两个值定义好了他们分别用INT_MAX和INT_MIN代表
那么上面的代码就可以改成
#include<iostream>
using namespace std;
int main()
{
cout<<"IntMax = "<<INT_MAX<<endl;
cout<<"IntMin = "<<INT_MIN<<endl;
return 0;
}