2017-10-16 407 views
-2

我知道当我们比较带符号和无符号时,编译器将我们的带符号值转换为无符号值,当我们比较short和int时,编译器将较小类型转换为较大类型。但是我编写了这段代码来检查我们是否比较了一个带符号的int x = 0xdeadbeef和unsigned short y = 0xffff,然后在将unsigned short转换为int之后,我们应该在y的比较处应该有0x0000ffff,它应该小于x的无符号值。但是我的代码没有进入if条件,即x大于y。有人可以向我解释为什么?C++中signed int和unsigned short的比较

代码片段:

#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较大”。

+0

因为(有符号)x是负数。 – cleblanc

+0

但是,当比较无符号到一个签名不应该编译器将其转换回无符号? –

+0

btw你的代码是** C++ ** –

回答

0

当您从无符号到有符号类型转换x时,它会导致整数溢出。请注意,signed int可以保持比unsigned int更小的正值。所以当发生整数溢出时,在大多数平台上,它会像你的车的里程表一样动作。即一旦int值超过它可以存储的最大值,它就从头开始。在32位系统(int32)上使用signed int的'开始'将是-2,147,483,648

所以在你的情况x是0xDEADBEEF或3,735,928,559。 32位系统上的unsigned int可以存储此值。但是,如果输入为signed,则会导致溢出,因此应用上述规则并将该值转换为-1,588,444,912。由于它是否定的,因此您在if声明中的条件不满足,因此您的声明不会被打印。