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

时间:2011-06-15 23:17:43

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

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

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

7 个答案:

答案 0 :(得分:16)

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

请参阅http://www.cplusplus.com/doc/tutorial/constants/

答案 1 :(得分:8)

答案 2 :(得分:3)

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

如果从0x开始,你将获得十六进制

答案 3 :(得分:3)

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

答案 4 :(得分:2)

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

答案 5 :(得分:1)

0123位于octal

答案 6 :(得分:1)

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

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