C语言中整型数据类型的格式控制说明

在这里插入图片描述
我们知道,一个整数可以有三种表示形式,即十进制、八进制(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!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值