好的......所以我有一个愚蠢的想法,并尝试将值0123放入一个int,只是好奇看看会发生什么,我假设当我打印的值我得到123,但我得到83 ......有什么想法吗?在编译器/内存中发生什么使得该值变为83?
我在C ++和C中使用GCC编译器尝试了这个,并尝试使用浮点数产生相同的结果。
答案 0 :(得分:16)
在C / C ++中,前缀为'0'的数字文字是八进制(基数为8)。
答案 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
),因为如果整数文字不可表示,则程序变得格式不正确。