Mar*_*cus 4 c parsing compilation numeric literals
C 标准/编译器如何将负整数解释为单个文字,或解释为(一元)运算符和数字文字?
例如,被-16
解释为 a-16
或-(16)
?
-16
是两个标记:一个运算符-
和一个值为 16 且类型为 的整数常量int
。
尝试下面。即使是库常量也是经过精心构建的,以避免-2147483648
它具有相同的值,(-0x7fffffff-1)
但它是一个更宽的类型,因为2147483648
它超出了int
范围。
#define STRINGIFY(x) #x
#define TOSTRING(x) STRINGIFY(x)
puts(TOSTRING(INT_MIN));
Run Code Online (Sandbox Code Playgroud)
输出
(-0x7fffffff-1)
Run Code Online (Sandbox Code Playgroud)
C 2018 6.4.4.1 1 显示整数常量的语法。它说整数常量是以下之一:
\n由于我们只对它们如何开始感兴趣,因此整数后缀与我们无关。下面的语法规则表明:
\n1
、2
、3
、4
、5
、6
、7
、8
、 或之一9
。0
。0x
以或开头0X
。因此,没有以或开头的整数常量。-
+
-16
被解析为一元-
运算符后跟整数常量16
。这形成了 C 2018 6.6 6 中指定的整数常量表达式,其中表示:
\n\n\xe2\x80\xa6整数常量表达式应具有整数类型,并且只能具有整数常量、枚举常量、
\nsizeof
字符常量、结果为整数常量的表达式、_Alignof
表达式和作为强制转换的立即操作数的浮点常量的操作数\ xe2\x80\xa6