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
语句中的条件不满足,因此您的语句永远不会被打印。
我知道当我们比较 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
语句中的条件不满足,因此您的语句永远不会被打印。