【问题标题】:Compare int and unsigned int比较 int 和 unsigned int
【发布时间】:2011-11-22 20:12:38
【问题描述】:

如果需要将int xunsigned int y 进行比较,后者在C99gcc 4.4+ 中更安全/更好/更好:

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

重要吗?

【问题讨论】:

  • 它通常无关紧要,除非在溢出情况下(>= MAX_UINT/2,即 MAX_INT,即 32 位机器上的 2**31)。
  • @BasileStarynkevitch:但这大约是可能值的 50%!还有什么比这更重要?
  • 我同意,但是溢出测试并没有真正的自然意义......(并且机器内部的测试仍然相同)。所以还是没关系……机器码差不多……

标签: c gcc


【解决方案1】:

最安全的是在投射前检查数字是否在范围内:

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

【讨论】:

  • 谢谢,当我们确定 y < INT_MAX/2 时可以使用 (int)y 吗?
  • 是的,没关系,而且打字速度可能更快(当编译器不是很优化时,执行速度)
  • 您不应该进行强制转换并让编译器选择。 “通常的算术转换”的规则有点复杂,但本质上存在转换为int 的架构和其他架构的转换为unsigned 的架构,这是有充分理由的。
  • @James,你的意思可能是y < INT_MAX,不是吗?
  • @Jens:是的,我做到了,y < INT_MAX
【解决方案2】:

是的,这很重要。

在具有 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(二进制补码否定)。严格来说,这是实现定义的行为,因此在不同平台上可能会有所不同。

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

【讨论】:

    猜你喜欢
    • 2011-07-02
    • 2013-06-15
    • 1970-01-01
    • 2020-08-28
    • 1970-01-01
    • 2018-08-25
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    相关资源
    最近更新 更多