关于C语言中printf中的%x转换说明符

    昨天在做一个程序,把int数据分成4片,存入到一个字符数组中,结果发现了一个这样的问题!比如我写了这样一个代码:

#include<stdio.h>
int main(int argc,char *argv[])
{
    char bit = 0xAA;
    printf("%X\n",bit);

    return 0;
}

   我想输出bit中的内容,结果输出的却是4个字节的内容,如下图:


   后来我上网查找解决办法,发现在csdn论坛里面也有人提这个问题,下面给出的解决方案是将char变成unsigned char类型就可以了,后来一试,发现果然可以,但是还是不明白其中的原理,今天特意翻看了一下《c primer plus》,才终于懂了!Ok,废话少扯,接下来就来说一下这是怎么个一回事!

   先贴上《C primer plus》中关于%X的定义:使用十六进制数字0F的无符号十六进制整数(C primer plus第五版,p68)

   注意最后那个整数,我个人理解的这里的意思就是,%X要将值转换成int整数类型再来进行输出!

   比如我上面那个程序中,bit的值是0xAA,我的电脑中默认定义的char是有符号类型,所以这个值就是-86,转换成int类型之后就变成了FF FF FF AA。所以最后的输出结果就成了上面那个截图中的样子。而把char类型变成unsigned char类型之后,bit的值0xAA表示的就是170,那么把它转换成int类型之后就变成了00 00 00 AA。所以把用unsigned char定义后输出的结果就是AA了!

    那么问题来了,难道我们每回输出之前非得要转换成int吗?能不能不转换呢?当然可以了,这个问题C语言早就给我们提出解决方案了,那就是用hh这个修饰符!

    这是《C primer plus》中关于hh的定义:和整数转换说明符一起使用,表示一个signed char或unsigned char类型数值(C primer plus第五版,p70)

    这样每回我们输出的结果就是char类型的数值了!比如下面这段代码:

#include<stdio.h>
#include<limits.h>
int main(int argc,char *argv[])
{
    //这里输出结果表明我的计算机中char类型默认是带符号的!
    printf("Char is %d bit,it's minimum value is %d\n",CHAR_BIT,CHAR_MIN);  

    char bit;
    bit = 0xAA;
    printf("bit = %d\n",bit);
    printf("bit = %hhx\n",bit);
    return 0;
}
   它的输出结果如下:



  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值