3

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

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

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

问候,托马斯

4

3 回答 3

4

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

一旦你得到一个肯定的文字,一元运算符就会被应用。这就是为什么INT_MIN经常被定义为:

#define INT_MIN     (-2147483647 - 1)

因为你不能signed int在这个平台上用 a 代表 2147483648 。

于 2013-07-27T15:23:15.030 回答
3

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

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

于 2013-07-27T15:23:08.920 回答
2

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.

于 2013-07-27T15:52:10.143 回答