我刚刚开始阅读ISO C 2011标准,以及它的最后公开草案[1],并且在C词汇语法[1] [458ff。]中实现了所有(文字)数值常量没有签名。
这是否意味着编译器解释有符号的数字常量(如-5.1E10或-1) 作为相应的一元运算符的调用? 例如-1 =< => - (1),+ 512< => +(512)
更新: 我的错,“所有(文字)数字常数都是无符号的”我的意思是“所有(文字)数值常数都是非负的”
注意,托马斯
答案 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整数转换规则将签名结果转换为无符号。