我知道当我们将signed与unsigned进行比较时,编译器会将我们的签名值转换为unsigned,当我们将short与int进行比较时,编译器会将较小的类型转换为较大的类型 . 但是我编写了这段代码来检查我们是否比较了一个有符号的int x = 0xdeadbeef和unsigned short y = 0xffff然后在将unsigned short转换为int后,我们在y的比较中应该有一个0x0000ffff,它应该小于x的无符号值 . 但是我的代码没有进入x大于y的if条件 . 有人可以向我解释原因吗?
代码链:
#include<iostream>
using namespace std;
int main (){
unsigned int x=0xDEADBEEF;
unsigned short y= 0xFFFF;
if((signed)x > y)
cout<<"X is larger"<<endl;
return 0;
}
运行时,代码不会打印“X更大” .
1 回答
当您将
x
从无符号转换为有符号时,会导致整数溢出 . 请注意,signed int
可以包含比unsigned int
更小的正值 . 因此,当发生整数溢出时,在大多数平台上,它开始像你的汽车's odometer. i.e. once the int value exceeds the max it can store, it starts from the beginning. The '一样开始'如果32位系统上的signed int(int32)将是-2,147,483,648
.所以在你的情况下,x是0xDEADBEEF或3,735,928,559 . 32位系统上的unsigned int可以存储该值 . 但是,当它被类型转换为
signed
时,会导致溢出,因此上述规则适用并将该值转换为-1,588,444,912 . 由于它是负数,因此if
语句中的条件不满足,因此您的语句永远不会被打印 .