0

printf ステートメントで以下のコードを使用しました。

void main()
{
    int n=0102;
    printf("%d", n);
}

これは、答えとして 66 を出力します。また、変数 n の値を 012 に変更しました。答えは 10 です。この変換方法について教えてください。

4

4 に答える 4

7

これは、数値 (整数定数) の 1 桁目が(2 桁目がまたはであって0はならない) の場合、コンパイラがそれを 8 進数として解釈するためです。で印刷すると、10進数の値が得られます。 8 進数値を出力するには、指定子 を使用する必要がありますxX%d
%o

   printf("%o", n);  

6.4.4.1 整数定数:

  1. 整数定数は数字で始まりますが、ピリオドまたは指数部はありません。ベースを指定するプレフィックスと、そのタイプを指定するサフィックスを持つ場合があります。

  2. 10 進定数はゼロ以外の数字で始まり、一連の 10 進数字で構成されます。8 進定数は、接頭辞 0 と、その後に続く 0 から 7 までの数字のシーケンスのみで構成されます。16 進数の定数は、接頭辞 0x または 0X とそれに続く一連の 10 進数と文字 a (または A) から f (または F) で構成され、それぞれ値は 10 から 15 です。


整数定数:

1. 10 進定数:で始まってはなりません0

 12  125  3546  

2. 8 進定数: で始まる必要があり0ます。

 012 0125 03546  

3. 16 進定数0x: 常にまたはで始まります0X

 0xf 0xff 0X5fff   
于 2013-10-29T07:56:54.150 に答える
4

値を 10 進数 (%d) で出力するように printf に指示します。%o を使用して、8 進数で出力します。

于 2013-10-29T07:58:38.637 に答える
1

で始まり、0その後に数字のみが続く数値リテラルは、8 進数として扱われます。したがって

0102 = (1 * 8^2) + (0  * 8^1) + (2 * 8^0)  = 64 + 0 + 2 = 66
012 = (1 * 8^1) + (2 * 8^0) = 8 + 2 = 10
于 2013-10-29T07:58:34.837 に答える