【问题标题】:In C storing values that start with zero get mutated, why?在 C 中存储以零开头的值会发生突变,为什么?
【发布时间】:2017-03-08 17:44:31
【问题描述】:

例如:

int main(){

    int x = 01234567;

    printf("\n%d\n",x);

    return 0;

}

以下代码产生:342391

如果我没有在开头包含 0,则值 x 将是 1234567,为什么 C 以这种方式存储该值,有什么办法不这样做?

【问题讨论】:

    标签: c int storage


    【解决方案1】:

    因为以 0 开头的数字表示为 octal numbers。您不能真正修改此行为,只是不要在开头包含零。

    【讨论】:

      【解决方案2】:

      以 0 开头的数字常量被解释为以 8 为底。

      【讨论】:

        【解决方案3】:

        以 0 开头的整数常量被解释为八进制(base-8),而不是十进制(base-10)。这类似于0x 触发十六进制(base-16)解释。

        基本上你在这里能做的就是不要在你的整数常量上加上前导 0。

        【讨论】:

          【解决方案4】:

          在编译时,C 编译器将识别代码中的任何整数字面量,然后通过一组规则解释这些字面量,以获取它们的二进制值以供您的程序使用:

          • Base-16(十六进制)- 任何以“0x”开头的整数文字都将被视为十六进制值。所以int x = 0x22 给出了x 的十进制值2 * 16^1 + 2 * 16^0 = 34
          • Base-8(八进制)- 任何以“0”开头的整数文字都将被视为八进制值。所以int x = 022 给了x 2 * 8^1 + 2 * 8^0 = 18 的十进制值。
          • Base-10(十进制)- 任何与其他两个规则不匹配的整数文字都将被视为十进制值。所以int x = 22 给了x 22 的十进制值。

          需要注意的是,GCC supports an extension 提供了另一个以二进制格式指定整数的规则。此外,这些规范方法仅在编译时支持整数文字。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-01-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-11-15
            • 1970-01-01
            • 1970-01-01
            • 2018-04-08
            相关资源
            最近更新 更多