C标准/编译器是如何解释负整数的 - 作为一个单独的文字,还是一元运算符和数字文字?
例如,-16
被解释为 -16
还是 -(16)
?
C标准/编译器是如何解释负整数的 - 作为一个单独的文字,还是一元运算符和数字文字?
例如,-16
被解释为 -16
还是 -(16)
?
-16
包含两个标记:操作符-
和一个值为16,类型为int
的整数常量。
尝试以下代码。即使是库常量也要经过精心构造,以避免-2147483648
,这个值与(-0x7fffffff-1)
相同,但是它是一个更宽的类型,因为2147483648
超过了int
范围。
#define STRINGIFY(x) #x
#define TOSTRING(x) STRINGIFY(x)
puts(TOSTRING(INT_MIN));
输出
(-0x7fffffff-1)
0x80000000
没有更宽的类型:在32位架构上,它的类型是unsigned
,宽度与int
相同,但是是不同的类型。使用“(-0x7fffffff-1)”这个迂回表达式可以计算出类型为int
的INT_MIN
。 - chqrlie1
, 2
, 3
, 4
, 5
, 6
, 7
, 8
或 9
。0
开头。0x
或 0X
开头。-
或 +
开头。
-16
被解析为一元运算符 -
后面跟着整数常量 16
。这形成了一个整数常量表达式,如 C 2018 6.6 6 所述,它表示:
… 一个 integer constant expression 必须具有整数类型,并且只能具有整数常量、枚举常量、字符常量、结果为整数常数的
sizeof
表达式、_Alignof
表达式和是转换的直接操作数的浮点常量。
INT_MIN
的原因是像这样:#define INT_MIN (-2147483647 - 1)
,因为正数2147483648太大了,无法适应类型int
,所以它会变成long
或其他类型。这对于各种隐式类型原因来说是不好的,例如从宽类型赋值到窄类型。而将一元运算符-
添加到2147483648
上也没有帮助,因为整数常量在那时已经具有long
类型了。 - Lundin