C++ c+中有符号int和无符号short的比较+;

C++ c+中有符号int和无符号short的比较+;,c++,unsigned,signed,C++,Unsigned,Signed,我知道,当我们比较signed和unsigned时,编译器将有符号值转换为unsigned,当我们比较short和int时,编译器将较小的类型转换为较大的类型。但是我写这段代码是为了检查我们是否比较了有符号的int x=0xdeadbeef和无符号的short y=0xffff,然后在将无符号的short转换为int之后,我们应该在y中有0x0000ffff,这应该小于x的无符号值。但是我的代码没有进入if条件,即x大于y。有人能给我解释一下原因吗 代码段: #include<iostre

我知道,当我们比较signed和unsigned时,编译器将有符号值转换为unsigned,当我们比较short和int时,编译器将较小的类型转换为较大的类型。但是我写这段代码是为了检查我们是否比较了有符号的int x=0xdeadbeef和无符号的short y=0xffff,然后在将无符号的short转换为int之后,我们应该在y中有0x0000ffff,这应该小于x的无符号值。但是我的代码没有进入if条件,即x大于y。有人能给我解释一下原因吗

代码段:

#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;
}
#包括
使用名称空间std;
int main(){
无符号整数x=0x0;
无符号短y=0xFFFF;
如果((签名)x>y)

cout当您键入cast
x
从无符号转换为有符号时,它会导致整数溢出。请注意,
有符号整数
可以比无符号整数
持有更小的正值。因此,当整数溢出发生时,在大多数平台上,它开始像汽车的里程表一样工作。也就是说,一旦整数值超过最大值,它就开始工作可以存储,它从开头开始。32位系统(int32)上有符号整数的“开头”将是
-2147483648


因此,在您的情况下,x是0xDEADBEEF或3735928559。32位系统上的无符号int可以存储此值。但是,当它被类型转换为有符号时,它会导致溢出,因此上述规则适用并将该值转换为-15884912。由于它是负数,因此如果语句中的条件不正确,则
中的条件不正确“我不满意,因此你的声明永远不会被打印出来。

因为(签名)x是负数。但是当比较无符号和有符号时,编译器不应该将其转换回无符号吗?顺便说一句,您的代码是C++的,因为
0xDEADBEEF
不能用32位整数表示,结果是实现定义的-在这种情况下是负数。它小于任何无符号短值-无符号短值在中提升为
t
在比较之前。我不明白为什么不能用32位无符号整数来表示0x1。并且在无符号时它怎么可能是负数?