【问题标题】:What does it mean when a numeric constant in C/C++ is prefixed with a 0?当 C/C++ 中的数字常量以 0 为前缀时,这意味着什么?
【发布时间】:2011-06-15 23:17:42
【问题描述】:

好的...所以我有一个愚蠢的想法并尝试将值 0123 放入一个 int 中,只是想看看会发生什么,我假设当我打印该值时我会得到 123,但实际上我得到了 83 ...任何想法为什么?编译器/内存中发生了什么使该值变为 83?

我在 C++ 和 C 中使用 GCC 编译器进行了尝试,还尝试使用产生相同结果的浮点数。

【问题讨论】:

    标签: c++ c compiler-construction syntax numbers


    【解决方案1】:

    在 C/C++ 中,以“0”为前缀的数字文字是八进制(以 8 为基数)。

    http://www.cplusplus.com/doc/tutorial/constants/

    【讨论】:

      【解决方案2】:

      【讨论】:

      • 娱乐胜于困惑。 :-)
      • To write numbers in octal, precede the value with a 0. ... To write numbers in octal, precede the value with a 0x or 0X. doh!
      • D'oh! 是对的!将其更改为更好的...谢谢!
      【解决方案3】:

      这是因为像这样以 0 开头的任何数字都被认为是八进制(以 8 为基数)而不是十进制。

      同样的事情,如果你以 0x 开头,你会得到十六进制

      【讨论】:

        【解决方案4】:

        前导 0 表示“八进制”数。所以它变成 1*8^2 + 2*8^1 + 3*8^0 = 83

        【讨论】:

        • 它是前导 0(零),而不是前导 O (o)。
        • 当然你说的很对,刚刚意识到我的错误,又回来编辑了。很想给自己一个-1的愚蠢:-)
        【解决方案5】:

        0123 是八进制常数(以 8 为底)。 83 是十进制等值。

        【讨论】:

          【解决方案6】:

          0123octal 中。

          【讨论】:

            【解决方案7】:

            根据 [lex.icon] 中的 C++ 标准,整数字面量可以分为 3 种类型:十进制字面量、八进制字面量和十六进制字面量,每一种都可以有符号和长度的后缀输入

            十进制文字必须以非零数字开头,而八进制文字以 0 开头,十六进制文字有 0x 和 0X,在前缀(对于八进制文字和十六进制文字)之后的任何数字在相应的基础中不可表示应该会触发编译错误(例如 09 导致 error C2041: illegal digit '9' for base '8' 和在其他编译器中 prog.cpp:6:15: error: invalid digit "9" in octal constant),因为如果整数文字不可表示,则程序将变得不正确。

            【讨论】:

              猜你喜欢
              • 2012-05-29
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-10-24
              相关资源
              最近更新 更多