#include<iostream>
using namespace std;
int main()
{
int a=2147483647;
unsigned int d=2747483647;
unsigned int e=2147483648;
//if(a>b)cout<<1<<endl; //不优化
if(2147483647>-2147483648)cout<<"2147483647>-2147483648"<<endl;
else cout<<"2147483647<=-2147483648"<<endl;
if(2147483647>-2147483649)cout<<"2147483647>-2147483649"<<endl;
else if(2147483647==-2147483649)cout<<"2147483647=-2147483649"<<endl;
else cout<<"2147483647<-2147483649"<<endl;
if(2147483647>-2147483650)cout<<"2147483647>-2147483650"<<endl;
else cout<<"2147483647<=-2147483650"<<endl;
return 0;
}
执行结果:
2147483647<=-2147483648
2147483647=-2147483649
2147483647>-2147483650
请按任意键继续. . .
可以看到黄色部分是反常的,下面给出解析
if 中的整数,编译器默认是int型
48 49(正数+2147483648,49)溢出了,会被优化成无符号,这时数字前的负号会
对无符号2147483648的机器码取反加一,然后才存入内存!!!
注意,从机器码层面才能解释!
48加负号——10…0 取反加一还是10…00——无符号数表示为2147483648
49加负号——10…1取反加一为011…11——无符号数表示为2147483647
50加负号——10…0010取反加一为01…10——无符号数表示为2147483646
PS:如果是已经声明好的变量的话,编译器是不会自动优化的
#include<iostream>
using namespace std;
int main()
{
int a=2147483647;
int b=-2147483648;
if(a>b)cout<<"2147483647>-2147483648"<<endl;
else cout<<"2147483647<=-2147483648"<<endl;
return 0;
}
执行结果:
2147483647>-2147483648
请按任意键继续. . .
可以看到,并没有反常现象出现
原因是,已经声明了的int型的变量b 不会自动优化成无符号数
而是仍然按照int型的溢出规则——一旦溢出则加或减2的32次方
下面来看:
#include<iostream>
using namespace std;
int main()
{
int a=2147483647;
int b=-2147483648;
int c=-2147483649;
if(a>b)cout<<"2147483647>-2147483648"<<endl;
else cout<<"2147483647<=-2147483648"<<endl;
if(a>c)cout<<"2147483647>-2147483649"<<endl;
else if(a==c)cout<<"2147483647=-2147483649"<<endl;
else cout<<"2147483647<-2147483649"<<endl;
return 0;
}
运行结果:
2147483647>-2147483648
2147483647=-2147483649
请按任意键继续. . .
解析:
b=-2147483649 是负下溢,即超出了int能表示的负数的范围,此时
变量b经过溢出规则处理后的值为:-2147483649+2的32次方=2147483647
以上就结束啦!
下面附上溢出处理的文章:
溢出处理规则