如果需要将int x
与unsigned int y
进行比较,C99
和gcc 4.4+
更安全/更好/更好:
(unsigned int)x == y
x == (int)y
重要吗?
答案 0 :(得分:16)
最安全的是在投射前检查数字是否在范围内:
if (x >= 0 && ((unsigned int)x) == y)
答案 1 :(得分:7)
是的,这很重要。
在32位int
的平台上,例如
int x = -1;
unsigned y = 0xffffffff;
表达式x == y
会产生1
,因为通过“通常的算术转换”,x
的值将转换为unsigned
,从而转换为0xffffffff
。
表达式(unsigned int)x == y
也是1
。唯一的区别是您使用强制转换显式转换。
表达式x == (int)y
很可能也是1
,因为在大多数平台上将0xffffffff
转换为int
会产生-1
(两个补码为负数)。严格来说,这是实现定义的行为,因此可能在不同的平台上有所不同。
请注意,在任何情况下,您都不会获得“预期”结果0
。 Mark Byers' answer中给出了一个很好的实现。