我得到了意外的输出,但我无法找出原因。
#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 语言中,将 0x
或 0
放在整数文字值之前将导致编译器以 16 进制(十六进制)和 8 进制(八进制)解释该数字,分别。
通常,我们解释和读取以 10 为基数(十进制)的数字。然而,我们有时会使用这些其他基数,因为它们是有用的 2 的幂,可以表示位组(1 个十六进制数字 = 4 位,1 个八进制数字 = 3 位),并且位操作是 C 想要提供的。这就是为什么您会看到像 char
这样的东西用 2 个十六进制数字(例如 0x12
)表示,以将单个 char
设置为特定的位序列。
如果您想验证这一点,printf
还允许您使用 %x
和 以十六进制和八进制输出
分别代替 int
>%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);
}
如果运行该程序,您将得到以下结果:
gcc -ansi -O2 -Wall main.c && ./a.out
0100 => 100, 010 => 10, 1111 => 1111, 01111=> 1111
...这正是您在程序中设置的值,只是没有前缀。您只是在原始代码中赋值时错误地使用了另一种整数编码,并使用了不同的编码来输出值。
关于c - 为什么 C 编程会给出不同的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59225557/