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

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

本文关键字:前缀 什么 意味着 C++ 常量 数字      更新时间:2023-10-16

好的。。。所以我有一个愚蠢的想法,试着把0123的值代入int,只是想看看会发生什么,我以为当我打印这个值时,我会得到123,但实际上我得到了83…有什么想法吗?编译器/内存内部发生了什么,导致该值变为83?

我在C++和带有GCC编译器的C中尝试过这一点,也尝试过使用float,结果相同。

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

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

祝贺您!你发现了八进制。

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

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

前导的0表示一个"八进制"数字。所以它变成了1*8^2+2*8^1+3*8^0=83

0123是一个八进制常数(基数为8)。83相当于十进制数。

0123为八进制。

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

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