考虑:

int32_t f() {
  return 0x80000000;
}

为什么这不会导致编译器警告(至少在 GCC 上)? 0x80000000 超出 int32_t 的范围( INT32_MAX0x7fffffff )。我相信这应该会导致隐式转换 - 对吗?

进一步考虑:
if (f() == 0x80000000)
  foo();

以上导致 GCC 没有警告。然而
int32 ret = f();
if (ret == 0x80000000)
   baz();

导致“警告:有符号和无符号整数表达式之间的比较”。我相信这是因为 0x80000000 由于超出 unsigned int 的范围而具有 int 类型。那是对的吗?

假设我的假设都没有错,为什么第一次比较不会引起警告?

最佳答案

相关的警告开关似乎是 -Wconversion , which is not activated by -Wextra

关于c - 为什么从返回 int32_t 的函数返回 0x80000000 不会导致警告?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32656460/

10-11 16:38