printf以“%d”为数字,以0开头(前“0102”)给出意想不到的答案(ex’“66”)
我在printf语句中使用了下面的代码。
void main() { int n=0102; printf("%d", n); }
这打印66作为答案。 我还将变量n的值更改为012.它给出了答案10.请帮助我关于如何完成此转换?
这是因为当数字的第一个数字(整数常量)为0
(第二个数字不能是x
或X
)时,编译器会将其解释为八进制数。 使用%d
打印它将为您提供小数值。
要打印八进制值,您应该使用%o
说明符
printf("%o", n);
6.4.4.1整数常量:
整数常量以数字开头,但没有句点或指数部分。 它可能有一个指定其基数的前缀和一个指定其类型的后缀。
十进制常量以非零数字开头,由一系列十进制数字组成。 八进制常量由前缀0组成,可选地后跟一个数字0到7的序列 。 hex常量由前缀0x或0X后跟一个十进制数字序列和字母a(或A)到f(或F)分别由值10到15组成。
整数常量:
1. 十进制常量 : 不能以0
开头。
12 125 3546
2. 八进制常量 :必须以0
开头。
012 0125 03546
3. hex常量 :始终以0x
或0X
0x
。
0xf 0xff 0X5fff
您告诉printf打印十进制值(%d)。 使用%o以八进制打印。
任何以0
开头,后跟数字的数字文字都被视为八进制数。 于是
0102 = (1 * 8^2) + (0 * 8^1) + (2 * 8^0) = 64 + 0 + 2 = 66 012 = (1 * 8^1) + (2 * 8^0) = 8 + 2 = 10