比较int和unsigned int。

12
如果需要比较 int xunsigned int y,在使用 C99gcc 4.4+ 时哪种方式更安全/更好/更好看:

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

这有影响吗?


通常情况下并不太重要,除非在溢出情况下(>= MAX_UINT/2,即MAX_INT,在32位机器上为2**31)。 - Basile Starynkevitch
3
@BasileStarynkevitch说:“但这已经占了可能值的50%!还有什么比这更重要的呢?” - undur_gongor
我同意,但是对于溢出的情况,测试并没有真正的自然意义...(在机器内部测试仍然是相同的)。所以这仍然不重要... 机器代码大致相同... - Basile Starynkevitch
2个回答

17

最安全的方法是在转换之前检查数字是否在范围内:

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

谢谢,如果我们确定 y < INT_MAX/2,那么做 (int)y 可以吗? - Cartesius00
1
@Jens:是的,我做了,y < INT_MAX - Cartesius00
@JensGustedt: 有吗?根据我理解的6.3.3.1,intunsigned具有相同的转换等级,并且根据6.3.1.8 ("否则,如果具有无符号整数类型的操作数的等级大于或等于另一个操作数的类型的等级,则具有带符号整数类型的操作数将转换为具有无符号整数类型的操作数的类型。"),int应该总是被转换为unsigned。不是吗? - undur_gongor
undur_gongor 是正确的,这意味着(只要 xint),强制转换是不必要的:if (x >= 0 && x == y) 就可以了。 - caf
我所做的是将无符号整数强制转换为长整型,然后编译器也会隐式地将整数转换为长整型。 - Spidey
显示剩余3条评论

9
是的,这很重要。
在一个使用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的答案中给出。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接