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

What does it mean when a numeric constant in C/C++ is prefixed with a 0?

提问人:CurtisJC 提问时间:6/16/2011 最后编辑:Rob KennedyCurtisJC 更新时间:6/16/2011 访问量:2752

问:

还行。。。所以我有一个愚蠢的想法,试着把值 0123 放进一个 int 中,只是好奇地想看看会发生什么,我以为当我打印值时我会得到 123,但我得到了 83......有什么想法吗?编译器/内存内部发生了什么使此值变为 83?

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

C++ C 编译器构造 语法 编号

评论


答:

18赞 Richard Schneider 6/16/2011 #1

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

查看 http://www.cplusplus.com/doc/tutorial/constants/

2赞 ribram 6/16/2011 #2

0123 是八进制常数(以 8 为底)。83 是十进制等价物。

8赞 Peter K. 6/16/2011 #3

祝贺!你已经发现了八进制。

评论

1赞 Peter K. 6/16/2011
娱乐胜于迷惑。:-)
0赞 mrk 6/16/2011
To write numbers in octal, precede the value with a 0. ... To write numbers in octal, precede the value with a 0x or 0X. 哎呀!
0赞 Peter K. 6/16/2011
哎呀!是对的!把它改成更好的......谢谢!
1赞 Bertrand Marron 6/16/2011 #4

0123八进制为单位。

3赞 Locksfree 6/16/2011 #5

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

同样的事情,如果你从 0x 开始,你会得到十六进制

3赞 Bill Forster 6/16/2011 #6

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

评论

0赞 Matteo Italia 6/16/2011
它是前导 (zero),而不是前导 (o)。0O
0赞 Bill Forster 6/16/2011
当然,你说得很对,只是意识到了我的错误并回来编辑。很想给自己一个愚蠢的-1:-)
1赞 lccarrasco 6/16/2011 #7

根据 [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