ISO C和签名的文字常量

我刚刚开始阅读ISO C 2011标准,以及它的最后公开草案[1] ,并意识到在C词汇语法[1] [458ff。]中所有(字面)数字常数都是无符号的。

这是否意味着编译器将带符号的数值常量(如-5.1E10或-1)解释为相应的一元运算符的调用? 例如-1 – (1),+ 512 +(512)

更新:我的错,“所有(文字)数字常数都是无符号的”我的意思是“所有(文字)数值常数都是非负的”

请注意,托马斯

所有非后缀十进制整数文字都是有符号的,但它们不能为负数。 也许非负面的是你所说的“无符号”,但我认为区分是很重要的 – 它们不是unsigned int类型。

一旦获得正数字,就会应用一元运算符。 这就是为什么INT_MIN通常被定义为:

 #define INT_MIN (-2147483647 - 1) 

因为您无法在此平台上使用signed int表示2147483648。

是的,您的解释是正确的,所有数字文字都不包含符号,最终符号是应用于它的一元运算符。

选择文字的类型,使得文字的值可以在该类型中表示,因此有效的有效数字文字总是表示正值。

all(literal)数值常量是无符号的。

这是错误的,实际上只有非前缀十进制整数文字被签名。 其他整数文字是无符号或有符号的。

这是否意味着编译器将带符号的数值常量(如-5.1E10或-1)解释为相应的一元运算符的调用? 例如-1 <=> – (1),+ 512 <=> +(512)

如果将-应用于无符号文字,其结果(通常)仍未签名。 例如:

 -1U // unsigned quantity -0xFFFFFFFF // unsigned quantity (assuming 32-bit int) 

签名结果通过C整数转换规则转换为无符号。