如果一个人需要用unsigned int y
这是更安全/更好/在C99
更好的与gcc 4.4+
比较int x
:Compare int和unsigned int类型
(unsigned int)x == y
x == (int)y
什么关系呢?
如果一个人需要用unsigned int y
这是更安全/更好/在C99
更好的与gcc 4.4+
比较int x
:Compare int和unsigned int类型
(unsigned int)x == y
x == (int)y
什么关系呢?
最安全的是检查的数量范围内铸造前:
if (x >= 0 && ((unsigned int)x) == y)
谢谢,当我们确定'y
是的,这是可以的,而且键入的速度可能更快(并且在编译器不是非常优化的时候执行) –
您不应该进行转换并让编译器选择。 “通常的算术转换”的规则有点复杂,但实质上有一些架构将转换为“int”,而其他架构则转换为“无符号”,原因很充分。 –
是的,这很重要。
在具有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中给出了一个很好的实现。
除了溢出情况(> = MAX_UINT/2,即MAX_INT,即32位机器上的2 ** 31),它通常并不重要。 –
@BasileStarynkevitch:但这大约有50%的可能值!更重要的是什么? –
我同意,但溢出测试并没有真正的自然感......(并且测试在机器内部仍然是一样的)。所以它仍然没有关系...机器代码大致相同... –