C语言中以十六进制输出字符型变量会出现'ffffff"的问题
2016-04-14 21:33
435 查看
最近在做一个C的嵌入式项目,发现在C语言中用printf()函数打印字符型变量时,如果想采用"%x"的格式将字符型变量值以十六进制形式打印出来,会出现一个小问题,如下:
C代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201604/25cba445dbcc17156ae29852dbe8a1d8.png)
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]
此外,如果有人这样来测试这个问题,
C代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201604/25cba445dbcc17156ae29852dbe8a1d8.png)
printf("%2x\n\n\n", 0xbf); /*在终端将会显示成:bf*/
为什么这边没有6个f呢?因为,printf()函数第二个参数直接以int型来接收,int型变量4bytes,二进制首位自然为0,因此不会显示多个f。
C代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201604/25cba445dbcc17156ae29852dbe8a1d8.png)
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]
此外,如果有人这样来测试这个问题,
C代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201604/25cba445dbcc17156ae29852dbe8a1d8.png)
printf("%2x\n\n\n", 0xbf); /*在终端将会显示成:bf*/
为什么这边没有6个f呢?因为,printf()函数第二个参数直接以int型来接收,int型变量4bytes,二进制首位自然为0,因此不会显示多个f。
相关文章推荐
- Teacher_Cadre c++多文件编程
- C语言中的sizeof和strlen
- [C语言][LeetCode][234]Palindrome Linked List
- c++的三次作业
- C语言变量与内存分配
- c++ map、multimap 的使用方法
- [C语言][LeetCode][2]Add Two Numbers
- 关于C++类型检查的一点小挫折
- 线程池原理及创建(C++实现)
- C语言学习笔记(结构体对齐问题)
- C/C++深度分析
- C/C++中各种类型int、long、double、char表示范围(最大最小值)
- 禁用编译器自动生成的函数(Effective C++之06)
- leetcode110题 题解 翻译 C语言版 Python版
- 【C++】C++中的Sequence Point,构造函数等问题
- 【day0414 C++】优先级队列 priority_queue的使用
- C语言 复制字符串 malloc
- 【day0414 C++】queue 队列的使用
- C语言 指针的深入理解
- 【day0414 C++】STL stack 栈的使用