最近在做一个C的嵌入式项目,发现在C语言中用printf()函数打印字符型变量时,如果想采用"%x"的格式将字符型变量值以十六进制形式打印出来,会出现一个小问题,如下:
char buf[10] = {0};
buf[0] = 0xbf;
printf("%2x\n\n\n", buf[0]); /*在终端将会显示成:ffffffbf*/
buf[1] = 0x7f;
printf("%2x\n\n\n", buf[1]); /*在终端将会显示成:7f*/
为什么buf[0]不像buf[1]显示的那样,显示2个十六进制数bf呢?
研究发现,只要字符型变量值的二进制第一位是1,就会如buf[0]所显示的那样,出现6个f。
而格式输出函数printf中会对所输出的变量做有符号/无符号型的判断。如果是有符号型变量,且该值二进制首位为1(如我们定义的是char buf[100],且buf[0]中为0xbf),则会按照补码形式前面全置为1,也就是全为f。(因为终端显示的是8个十六机制数字;另外,我用Tobor C编译,因为Tobor C中int是2bytes,终端显示就成4个十六进制数字了:ffbf,因此我猜测,printf函数显示之前先将有符号型值转换成了一个4bytes的int。当然,这是函数内部的处理,跟我们所说的话题关系不大。)。
按照上面述说的,如果把buf声明为unsigned char型,则显示会变成:bf
而且,如果程序需要讲一个有符号型的变量以十六进制形式输出,且只显示两位,可以强制类型转换为无符号型变量,如上面的buf[0],可以转换成:(unsigned char)buf[0]
此外,如果有人这样来测试这个问题,
printf("%2x\n\n\n", 0xbf); /*在终端将会显示成:bf*/
为什么这边没有6个f呢?因为,printf()函数第二个参数直接以int型来接收,int型变量4bytes,二进制首位自然为0,因此不会显示多个f。
分享到:
相关推荐
C语言二进制字符串与十六进制字符串相互转化,利用MFC框架生成小工具。
//输出格式: hex2bin 5e. //得到: 0101 1110 //====================================== #include <stdio>#include char *bitstr(char *, void const *, size_t); int main(int argc, char **argv){ unsigned char...
C语言,实现进制转换,十进制转换为十六进制 例如输入10,转换结果为a
C语言编程实现十进制转化为十六进制,在VC6.0中可顺利实现
STM32十六进制字符串转十进制数值STM32十六进制字符串转十进制数值STM32十六进制字符串转十进制数值
浮点数与十六进制转换,c语言开发 Float 转换成16进制(HEX)
16进制转字符串
才语言编写的十进制到十六进制的转化问题,提供具体的源代码,可供下载
C语言 · 十六进制转十进制 问题描述 从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。 注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。 样例输入 FFFF...
该代码是实现二进制转化为十六进制,可以用在嵌入式开发中,在嵌入式中,首先利用图片转换工具,将每个图片的像素点转换为二进制,然后在将使用该代码,将装换的二进制变为十六进制。
单精度浮点数与十六进制转换_C语言程序__单片机也可用
C语言实现进制转换
该matlab程序可实现C语言的float类型十六进制转换为十进制,供大家参考。
C语言-顺序栈实现十进制转换为二进制-八进制-十六进制
对初学者绝对值得看(如果你恰好需要的话) c语言实现十进制到十六进制的转换和对带有括号和小数点的数学表式的数值计算 当然还有链栈的基本操作的实现,但这不是主要的(因为这是我的一次实验报告)
c语言 进制转换 十进制 二进制 八进制 十六进制
C语言十进制转十六进制、十六进制转十进制、通过C语言代码来生成一组数据,通过不同的公式可生成不同大小和相位的正弦波数据。并通过串口将生成的数据打印出来。
十六进制转换成ASCII码并显示,十六进制转换成ASCII码并显示
Linux下用C语言将一个字符串格式(char*)的MAC地址转换为十六进制数组,代码简洁可直接使用