2011-11-22 202 views
8

如果一个人需要用unsigned int y这是更安全/更好/在C99更好的与gcc 4.4+比较int xCompare int和unsigned int类型

  1. (unsigned int)x == y
  2. x == (int)y

什么关系呢?

+0

除了溢出情况(> = MAX_UINT/2,即MAX_INT,即32位机器上的2 ** 31),它通常并不重要。 –

+2

@BasileStarynkevitch:但这大约有50%的可能值!更重要的是什么? –

+0

我同意,但溢出测试并没有真正的自然感......(并且测试在机器内部仍然是一样的)。所以它仍然没有关系...机器代码大致相同... –

回答

16

最安全的是检查的数量范围内铸造前:

if (x >= 0 && ((unsigned int)x) == y) 
+0

谢谢,当我们确定'y Cartesius00

+0

是的,这是可以的,而且键入的速度可能更快(并且在编译器不是非常优化的时候执行) –

+0

您不应该进行转换并让编译器选择。 “通常的算术转换”的规则有点复杂,但实质上有一些架构将转换为“int”,而其他架构则转换为“无符号”,原因很充分。 –

7

是的,这很重要。

在具有32位int的平台上,

int x = -1; 
unsigned y = 0xffffffff; 

表达x == y将产生1因为通过“通常的算术转换”的x的值被转换为unsigned并因此0xffffffff

表达式(unsigned int)x == y也是1。唯一的区别是你用转换明确地进行了转换。

表达x == (int)y将最有可能1以及因为转换0xffffffffint产量-1在大多数平台(补底片)。严格地说,这是实现定义的行为,因此可能在不同的平台上有所不同。

请注意,在任何情况下您都将得到“预期”结果0。在Mark Byers' answer中给出了一个很好的实现。