昨天在做一个程序,把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;
}
它的输出结果如下: