我们能够以及如何安全地签署"到#"未签名"在这种情况下保存一个比较的技巧?

时间:2015-07-10 18:03:47

标签: c++ c comparison unsigned-integer

例如

bool CheckWithinBoundary(int x, int b) {
  return (x>=0) && (x <= b);
}
bool CheckWithinBoundary2(int x, int b) { 
  return static_cast<uint32>(x) <= static_cast<uint32>(b);
}

CheckWithinBoundary2可以保存一个比较。

我的问题是:

  1. 今天的编译器可以使用它来优化代码吗?或者我怎样才能做到 编译器做这种优化吗?

  2. 使用这个技巧有危险吗?

1 个答案:

答案 0 :(得分:3)

2的答案是,是的,这两个是不一样的。看来你也默默地假设b >= 0。考虑例如x == 1b == -1,这将为第一个案例提供false,为第二个案例提供true

(我切换到C符号,这对我来说更容易,因为你似乎也对它感兴趣)

所以我们实际上已经有了

static_assert(INT_MAX < UINT_MAX);

bool CheckWithinBoundary(int x, int b) {
  return (b >=0) && (x>=0) && (x <= b);
}
bool CheckWithinBoundary2(unsigned x, unsigned b) { 
  return (b >=0) && (x <= b);
}

如果它编译,则在INT_MAX < UINT_MAX的所有体系结构中都是等效的,然后隐式转换int --> unsigned做正确的事。

但请注意,您注意我使用的是unsigned而不是uint32_t,因为您必须确保使用宽度相同的无符号类型。我不知道是否存在64位int的架构,但是你的方法会失败。