当C / C ++中的数字常量以0为前缀时,这意味着什么?

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

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

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

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

恭喜! 你发现了八进制。

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

同样的事情,如果你从0x开始,你将得到hex

前导0表示“八进制”数。 因此它变为1 * 8 ^ 2 + 2 * 8 ^ 1 + 3 * 8 ^ 0 = 83

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

0123是八进制的 。

根据[lex.icon]中的C ++标准,整数文字可以分为3种类型:十进制文字,八进制文字和hex文字,每个文字都可以有一个signess和length类型的后缀

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