我们知道,一个整数可以有三种表示形式,即十进制、八进制(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!