【发布时间】:2011-06-15 23:17:42
【问题描述】:
好的...所以我有一个愚蠢的想法并尝试将值 0123 放入一个 int 中,只是想看看会发生什么,我假设当我打印该值时我会得到 123,但实际上我得到了 83 ...任何想法为什么?编译器/内存中发生了什么使该值变为 83?
我在 C++ 和 C 中使用 GCC 编译器进行了尝试,还尝试使用产生相同结果的浮点数。
【问题讨论】:
标签: c++ c compiler-construction syntax numbers
好的...所以我有一个愚蠢的想法并尝试将值 0123 放入一个 int 中,只是想看看会发生什么,我假设当我打印该值时我会得到 123,但实际上我得到了 83 ...任何想法为什么?编译器/内存中发生了什么使该值变为 83?
我在 C++ 和 C 中使用 GCC 编译器进行了尝试,还尝试使用产生相同结果的浮点数。
【问题讨论】:
标签: c++ c compiler-construction syntax numbers
在 C/C++ 中,以“0”为前缀的数字文字是八进制(以 8 为基数)。
【讨论】:
【讨论】:
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!
这是因为像这样以 0 开头的任何数字都被认为是八进制(以 8 为基数)而不是十进制。
同样的事情,如果你以 0x 开头,你会得到十六进制
【讨论】:
前导 0 表示“八进制”数。所以它变成 1*8^2 + 2*8^1 + 3*8^0 = 83
【讨论】:
0(零),而不是前导 O (o)。
0123 是八进制常数(以 8 为底)。 83 是十进制等值。
【讨论】:
0123 在octal 中。
【讨论】:
根据 [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),因为如果整数文字不可表示,则程序将变得不正确。
【讨论】: