考虑:
ExitAndWakeUpAppropriateWaiters
为什么不会导致编译器警告(至少在GCC上)? 0x80000000超出int32_t f() {
return 0x80000000;
}
范围(int32_t
为INT32_MAX
)。我相信这应该导致一个隐含的演员 - 这是正确的吗?
进一步说:
0x7fffffff
以上原因导致海湾合作委员会没有任何警告。然而
if (f() == 0x80000000)
foo();
原因"警告:有符号和无符号整数表达式之间的比较"。我相信这是因为0x80000000由于超出int32 ret = f();
if (ret == 0x80000000)
baz();
的范围而具有类型unsigned int
。那是对的吗?
假设我的假设都不对,为什么第一次比较没有引起警告呢?
答案 0 :(得分:3)
答案 1 :(得分:2)
我相信这是因为0x80000000的类型为unsigned int,因为它超出了int的范围。这是对的吗?
是的,因为它是十六进制整数文字,它的类型将是这些类型中最窄的,能够表示文字的值:
int
unsigned int
long
unsigned long
long long
unsigned long long