printf以"%d"为数字,以0开头(ex"0102")给出意想不到的答案(ex'"66")

Nir*_*ajT 0 c printf hex octal

我在printf语句中使用了下面的代码.

void main()
{
    int n=0102;
    printf("%d", n);
}
Run Code Online (Sandbox Code Playgroud)

这打印66作为答案.我还将变量n的值更改为012.它给出了答案10.请帮助我关于如何完成此转换?

hac*_*cks 6

这是因为当数字的第一个数字(整数常量)是0(并且第二个数字不能是xX)时,编译器会将其解释为八进制数.打印它%d会给你一个小数值.
要打印八进制值,您应该使用%o说明符

   printf("%o", n);  
Run Code Online (Sandbox Code Playgroud)

6.4.4.1整数常量:

  1. 整数常量以数字开头,但没有句点或指数部分.它可能有一个指定其基数的前缀和一个指定其类型的后缀.

  2. 十进制常量以非零数字开头,由一系列十进制数字组成.八进制常量由前缀0组成,可选地后跟一个数字0到7的序列.十六进制常量由前缀0x或0X后跟一个十进制数字序列和字母a(或A)到f(或F)分别由值10到15组成.


整数常量:

1. 十进制常数:不能0.开头.

 12  125  3546  
Run Code Online (Sandbox Code Playgroud)

2. 八进制常数:必须以a开头0.

 012 0125 03546  
Run Code Online (Sandbox Code Playgroud)

3. 十六进制常量:始终以0x或开头0X.

 0xf 0xff 0X5fff   
Run Code Online (Sandbox Code Playgroud)