【问题标题】:Why C programming gives different output? [duplicate]为什么 C 编程给出不同的输出? [复制]
【发布时间】:2019-12-07 11:34:57
【问题描述】:

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

    #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 

为什么会出现这样的输出?

【问题讨论】:

标签: c output


【解决方案1】:

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

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

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

#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);
}

如果你运行这个程序,你会得到以下结果:

gcc -ansi -O2 -Wall main.c && ./a.out
0100 => 100, 010 => 10, 1111 => 1111, 01111=> 1111

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

【讨论】:

    【解决方案2】:

    0 前缀为您提供八进制,而您尝试打印十进制。

    【讨论】:

      猜你喜欢
      • 2014-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-23
      • 2022-11-16
      • 1970-01-01
      相关资源
      最近更新 更多