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

时间:2017-10-16 17:55:00

标签: c++ unsigned signed

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

CODE SNIPPET:

_

运行时代码不打印" X更大"。

1 个答案:

答案 0 :(得分: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语句中的条件并不满足,因此您的语句永远不会被打印。