我刚刚开始阅读 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
在这个平台上用 a 代表 2147483648 。
是的,您的解释是正确的,所有数字文字都不包含符号,最终符号是应用于它的一元运算符。
文字类型的选择方式是文字的值可以在该类型中表示,因此有效的数字文字总是表示正值。
all (literal) numerical constants are unsigned.
This is wrong, actually only non-prefixed decimal integer literals are signed. The other integer literals are unsigned or signed.
Does that mean that the Compiler interpret a signed numerical constant (like -5.1E10 or -1) as a call of the corresponding unary-operator ? e.g -1 <=> -(1) , +512 <=> +(512)
If you apply -
to an unsigned literal, its result is (usually) still unsigned.
For example:
-1U // unsigned quantity
-0xFFFFFFFF // unsigned quantity (assuming 32-bit int)
The signed result is converted to unsigned through the rules of C integer conversion.