为什么C编程会提供不同的输出?

时间:2019-12-07 11:34:57

标签: c output

我得到了意外的输出,我无法弄清原因。

    #include <stdio.h>

    int main() {
        int a = 0100;
        int b = 010;
        int c = 1111;
        int d = 01111;
        printf("0100 => %d, 010 => %d, 1111 => %d, 01111=> %d\n", a, b, c, d);
   }

输出:

0100 => 64, 010 => 8, 1111 => 1111, 01111=> 585 

为什么会出现这种输出?

2 个答案:

答案 0 :(得分:5)

在C语言中,将0x0放在整数文字值之前将使编译器分别解释以16为基数(十六进制)和以8为基数(八进制)的数字。

通常,我们以10进制(十进制)解释和读取数字。但是,有时我们会使用这些其他基数,因为它们是2的有效幂,可以表示位组(1个十六进制数字= 4位,1个八进制数字= 3位),并且位操纵是C想要提供的。这就是为什么您会看到类似char之类的东西用2个十六进制数字(例如0x12)表示将单个char设置为特定位序列的原因。

如果您要验证这一点,printf还允许您分别使用int%x而不是{{1},以十六进制和八进制输出%o }。

%d

如果运行此程序,则会得到以下信息:

#include <stdio.h>
int main()
{
    int a = 0100;
    int b = 010;
    int c = 1111;
    int d = 01111;
    printf("0100 => %o, 010 => %o, 1111 => %d, 01111=> %o\n", a,b,c,d);
}

...这正是您在程序中设置的值,只是没有前缀。您只是在原始代码中无意中错误地使用了另一种整数编码,并使用了另一种整数编码来输出值。

答案 1 :(得分:3)

0前缀为八进制,并且您尝试打印十进制。