我得到了意想不到的输出,我无法弄清楚原因。
#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);
}
Run Code Online (Sandbox Code Playgroud)
输出:
0100 => 64, 010 => 8, 1111 => 1111, 01111=> 585
Run Code Online (Sandbox Code Playgroud)
为什么会出现这样的输出?
在 C 中,将任一0x或放在0整数文字值之前将导致编译器分别解释以 16 进制(十六进制)和以 8 进制(八进制)表示的数字。
通常,我们解释和读取基数为 10(十进制)的数字。但是,我们有时会使用这些其他基数,因为它们是有用的 2 的幂,可以表示位组(1 个十六进制数字 = 4 位,1 个八进制数字 = 3 位),并且位操作是 C 想要提供的。这就是为什么您会看到诸如char用 2 个十六进制数字(例如0x12)来表示将单个设置char为特定位序列的原因。
如果您想验证这一点,printf还允许您分别int使用%x和%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);
}
Run Code Online (Sandbox Code Playgroud)
如果你运行这个程序,你会得到以下信息:
#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);
}
Run Code Online (Sandbox Code Playgroud)
...这正是您在程序中设置的值,只是没有前缀。您只是在原始代码中意外地在赋值时错误地使用了另一种整数编码,并使用了不同的一种来输出值。