在考虑“-”是否是数字常数的一部分时会出现混淆。
在下面的代码中,0x80000000是数字常量。它的类型仅由此确定。 "-"应用之后,但
不会改变类型。
#define INT32_MIN (-0x80000000)
long long bal = 0;
if (bal < INT32_MIN )
原始的未经装饰的数字常量是正数。
如果是十进制,则分配的类型是能够容纳它的第一个类型: int
, long
, long long
。
如果常量是八进制或十六进制,它将获得能够容纳它的第一个类型: int
, unsigned
, long
, unsigned long
, long long
, unsigned long long
。
在OP的系统上,0x80000000
会被视为unsigned
或unsigned long
类型。无论哪种情况,它都是某个无符号类型。
-0x80000000
也是某个非零值,并且由于是一些无符号类型,它大于0。当代码将其与long long
进行比较时,两端的值不会改变,因此0 < INT32_MIN
为真。
另一种定义可以避免这种奇怪的行为。
#define INT32_MIN (-2147483647 - 1)
让我们暂时进入幻想之地,假设int
和unsigned
类型都是48位。
那么0x80000000
适合于int
类型,并且int
类型为有符号整数。因此-0x80000000
是一个负数,打印输出结果也就不同了。
[回到现实世界]
由于0x80000000
可以适应某些无符号类型,在某些已知的有符号类型最大值some_signed_MAX
之上但在some_unsigned_MAX
之内,因此它是一种无符号类型。
CHAR_BIT * sizeof(int)
的值是多少? - 5gon12eder<limits.h>
将INT_MIN
定义为(-2147483647 - 1)
,现在你知道原因了。 - zwol