【发布时间】:2017-10-16 17:54:59
【问题描述】:
我知道,当我们比较有符号和无符号时,编译器会将我们的有符号值转换为无符号值,而当我们将 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 large”。
【问题讨论】:
-
因为 (signed)x 是负数。
-
但是当将无符号与有符号进行比较时,编译器不应该将其转换回无符号吗?
-
顺便说一句,您的代码在 C++ 中
-
因为
0xDEADBEEF不能用 32 位 int 表示,所以结果是实现定义的 - 在这种情况下为负数。它小于 any unsigned short 值 - 在比较之前 unsigned short 被提升为int。 -
我不明白为什么 0xdeadbeef 不能用 32 位无符号整数表示。未签名时怎么可能是负数?