比较int和unsigned int
如果需要将int x
与unsigned int y
进行比较,这在C99
和gcc 4.4+
更安全/更好/更好:
-
(unsigned int)x == y
-
x == (int)y
有关系吗?
最安全的是在投射前检查数字是否在范围内:
if (x >= 0 && ((unsigned int)x) == y)
是的,这很重要。
在具有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的回答给出了一个很好的实现。