我得到了意外的输出,我无法弄清原因。
#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
为什么会出现这种输出?
答案 0 :(得分:5)
在C语言中,将0x
或0
放在整数文字值之前将使编译器分别解释以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
前缀为八进制,并且您尝试打印十进制。