0

我在 printf 语句中使用了以下代码。

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

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

4

4 回答 4

7

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

   printf("%o", n);  

6.4.4.1 整数常量:

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

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


整数常量:

1.十进制常量不能以 .开头0

 12  125  3546  

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

 012 0125 03546  

3.十六进制常量:总是以0xor开头0X

 0xf 0xff 0X5fff   
于 2013-10-29T07:56:54.150 回答
4

您告诉 printf 以十进制 (%d) 形式打印该值。使用 %o 以八进制打印。

于 2013-10-29T07:58:38.637 回答
1

任何以数字开头的数字文字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
于 2013-10-29T07:58:34.837 回答
0

这里的问题是当您在 102 编译器将其视为八进制数之前使用 0 时。这是一条规则。当您使用 %d 打印数字时,它将八进制数转换为十进制数。这就是为什么你得到 66,它是八进制 102 的十进制形式。

于 2022-02-25T07:07:55.533 回答