【问题标题】:ISO C and signed literal constantsISO C 和有符号文字常量
【发布时间】:2013-07-27 15:17:19
【问题描述】:

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

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

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

尊敬的托马斯

【问题讨论】:

    标签: c constants literals iso


    【解决方案1】:

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

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

    #define INT_MIN     (-2147483647 - 1)
    

    因为您不能在此平台上用signed int 表示 2147483648。

    【讨论】:

    • 不,并非所有文字都已签名,您可能的意思是“所有没有U 后缀的十进制文字都已签名”。八进制和十六进制文字可以是无符号的,即使没有 U 后缀。
    【解决方案2】:

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

    字面量的类型是这样选择的,即字面量的值可以在该类型中表示,因此有效的数字字面量总是表示正值。

    【讨论】:

      【解决方案3】:

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

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

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

      如果将- 应用于无符号文字,其结果(通常)仍然是无符号的。 例如:

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

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

      【讨论】:

        猜你喜欢
        • 2020-05-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-17
        • 2013-05-08
        • 1970-01-01
        • 2019-04-08
        • 1970-01-01
        相关资源
        最近更新 更多