从零开始的数字有什么特别之处?

时间:2014-10-25 23:10:26

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

这是一个有点愚蠢的问题,但对我来说很有趣)

这是我使用visual studio 2013获得的

int i = 07;     // i == 7
int i = 16;     // i == 16
int i = 00016;  // i == 14, why?
int i = 05016;  // i == 2574, wow )
int i = 08;     // compile error, compiler expects octal number...

如果number以零开头并且包含8,则编译错误。这是正常的吗?如果00016 == 14,那么编译器在启动零时究竟做了什么?

感谢所有))

4 个答案:

答案 0 :(得分:8)

是的,这是预期的。

  

[C++11: 2.14.2/1]: 整数文字是一个没有句点或指数部分的数字序列。整数文字可以具有指定其基数的前缀和指定其类型的后缀。数字序列的词汇第一个数字是最重要的。 十进制整数文字(十进制)以0以外的数字开头,由一系列十进制数字组成。 八进制整数文字(基数为8)以数字0开头,由一系列八进制数字组成。 22 A 十六进制< / em>整数文字(基数为16)以0x或0X开头,由一系列十六进制数字组成,包括十进制数字和字母a到f和A到F,十进制值为十到十五。 [例如:数字12可以写成12,014或0XC。 -end example]

     

22 数字8和9不是八进制数字。

答案 1 :(得分:5)

0开头的整数字面值为octal number,非常类似于以0x开头的数字是十六进制数字。

八进制数字只能包含数字07,这就是您收到编译错误的原因。

答案 2 :(得分:2)

0开头的整数文字是八进制文字。因此,它们只能包含数字0-7。

(有趣的是,这包括文字0本身。)

答案 3 :(得分:2)

从0开始的数字使其成为八进制,因此数字8和9是非法的,而您的其他示例显示转换为十进制。