
我们知道,一个整数可以有三种表示形式,即十进制、八进制(0开头)、十六进制(0x或0X开头)。我们也可以以这三种形式进行输入输出,但是十进制有负数的表示形式(10的负数是-10),八进制和十六进制没有负数的表示形式
printf("%o",12);
即将十进制数12用八进制的形式输出,输出八进制数14

printf("%o",-12);
会输出什么?输出是一个八进制数37777777764。

分析一下为什么:

也就是说编译器在将12的补码以八进制形式进行输出时,是直接处理这个补码,而没有进行转换。
看看%o应用于scanf()的情况:
int a;
scanf("%o",&a);
printf("%d\n",a);

如果输入的是一个负数呢?

-10是怎么来的?先把八进制数12转为十进制,再加上符号便是-10.此时内存存储的是-10的补码形式,故有:

综合上面所有例子,分析原因。
%o执行printf()时是直接从内存取出这个变量存储在内存的二进制数,而不care这个二进制数是正数or负数。它直接把这个二进制数转为十进制数然后转为八进制输出。%o在执行scanf()时,把输入的数视为一个八进制数,存储在内存的是这个八进制数对应的十进制数的补码。所以输入-12,存储在内存的是-10的补码。
那么为什么printf("%d",-10);是输出-10?因为%d在从内存取得变量的时候会去判断这个数是正or负。
与%o想同作用的有:%lo %x %lx
Over!

1479

被折叠的 条评论
为什么被折叠?



