为什么不从返回int32_t的函数返回0x80000000会导致警告?

时间:2015-09-18 16:04:04

标签: c types casting type-conversion unsigned

考虑:

ExitAndWakeUpAppropriateWaiters

为什么不会导致编译器警告(至少在GCC上)? 0x80000000超出int32_t f() { return 0x80000000; } 范围(int32_tINT32_MAX)。我相信这应该导致一个隐含的演员 - 这是正确的吗?

进一步说:

0x7fffffff

以上原因导致海湾合作委员会没有任何警告。然而

if (f() == 0x80000000)
  foo();

原因"警告:有符号和无符号整数表达式之间的比较"。我相信这是因为0x80000000由于超出int32 ret = f(); if (ret == 0x80000000) baz(); 的范围而具有类型unsigned int。那是对的吗?

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

  

我相信这是因为0x80000000的类型为unsigned int,因为它超出了int的范围。这是对的吗?

是的,因为它是十六进制整数文字,它的类型将是这些类型中最窄的,能够表示文字的值:

  • int
  • unsigned int
  • long
  • unsigned long
  • long long
  • unsigned long long