我正在编写像这样的代码
int reverse(int x) {
long long res;
......
if(x>0&&res>INT_MAX||x<0&&res>INT_MAX+1){
return 0;
}
......
}
它显示溢出,但当我向其添加转换时,它符合
int reverse(int x) {
long long res;
......
if(x>0&&res>(unsigned long long)INT_MAX||x<0&&res>(unsigned long long)INT_MAX+1){
return 0;
}
......
}
有人可以向我解释一下这是什么问题吗?
答案 0 :(得分:3)
INT_MAX+1
被评估为两个int
的整数加法。由于结果不是可以表示为int
的值范围,因此您会看到溢出。
(unsigned long long)INT_MAX+1
被评估为两个unsigned long long
的整数加法。由于运算符的两边和结果都在可以表示为unsigned long long
的值范围内,因此没有溢出。
答案 1 :(得分:2)
INT_MAX + 1
在这个子表达式中,+
的两个操作数的类型都是int
,因此结果的类型是int
,导致整数溢出。
但是,如果将一个操作数强制转换为unsigned long long
:
(unsigned long long)INT_MAX + 1
unsigned long long
的结果类型,因此没有溢出,就像那样简单。
答案 2 :(得分:-1)
触发溢出的是表达式
INT_MAX+1
因为INT_MAX的类型是int(32位整数),所以INT_MAX + 1超过了int的最大值。 一旦将其转换为无符号长整数(64位整数),
(unsigned long long)INT_MAX
现在远低于其类型的最大值,
(unsigned long long)INT_MAX + 1
有效