ISO C和签名的文字常量

时间:2013-07-27 15:17:20

标签: c constants literals iso

我刚刚开始阅读ISO C 2011标准,以及它的最后公开草案[1],并且在C词汇语法[1] [458ff。]中实现了所有(文字)数值常量没有签名。

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

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

注意,托马斯

3 个答案:

答案 0 :(得分:4)

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

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

的原因
#define INT_MIN     (-2147483647 - 1)

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

  

所有(文字)数字常数都是无符号的。

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

  

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

如果您将-应用于无符号文字,则其结果(通常)仍为无符号。 例如:

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

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