c++中signed int和unsigned short的比较

Comparison of signed int and unsigned short in c++

我知道当我们比较 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 is larger"。

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

所以在你的例子中,x 是 0xDEADBEEF 或 3,735,928,559。 32 位系统上的 unsigned int 可以存储此值。但是,当它被类型转换为 signed 时,会导致溢出,因此应用上述规则并将该值转换为 -1,588,444,912。由于它是否定的,您在 if 语句中的条件不满足,因此您的语句永远不会被打印。