好吧...所以我有一个愚蠢的想法,尝试将值 0123 放入 int 中,只是想看看会发生什么,我假设当我打印该值时我会得到 123,但我得到的是 83..任何想法为什么?编译器/内存内部发生了什么使该值变成 83?
我在 C++ 和 C 中使用 GCC 编译器尝试过此操作,并且还尝试使用浮点数,得到了相同的结果。
在 C/C++ 中,以“0”为前缀的数字文字是八进制(基数 8)。
这是因为任何像这样以 0 开头的数字都被认为是八进制(基数 8)而不是十进制。
同样的事情,如果你以 0x 开头,你将得到十六进制
前导 0 表示“八进制”数字。所以就变成了 1*8^2 + 2*8^1 + 3*8^0 = 83
0123 是一个八进制常数(基数为 8)。 83 是十进制等值。
0123
是八进制。
根据[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
),因为如果整数文字不可表示,程序就会变得不正确。