C语言中以十六进制输出字符型变量会出现'ffffff"的问题

最近在做一个C的嵌入式项目,发现在C语言中用printf()函数打印字符型变量时,如果想采用"%x"的格式将字符型变量值以十六进制形式打印出来,会出现一个小问题,如下:

C代码   收藏代码
  1. char buf[10] = {0};  
  2. buf[0] = 0xbf;  
  3. printf("%2x\n\n\n", buf[0]);            /*在终端将会显示成:ffffffbf*/  
  4.   
  5. buf[1] = 0x7f;  
  6. 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代码   收藏代码
  1. printf("%2x\n\n\n", 0xbf);               /*在终端将会显示成:bf*/  

 为什么这边没有6个f呢?因为,printf()函数第二个参数直接以int型来接收,int型变量4bytes,二进制首位自然为0,因此不会显示多个f。

  1. #include "StdAfx.h"   
  2. #include <iostream>   
  3. #include <stdio.h>   
  4. #include <string.h>   
  5. #include <malloc.h>   
  6.   
  7. #include <stdio.h>   
  8.   
  9.    
  10. int main()  
  11. {  
  12.     unsigned int a = 0xfffffff7;  
  13.       char i = (unsigned char)a;  
  14.     unsigned char *b = ( unsigned char *)&a;  
  15.     printf("%08x,%08x",i,*b);  
  16.     getchar();  
  17.     return 0;  
  18. }   
#include "StdAfx.h"
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <malloc.h>

#include <stdio.h>

 
int main()
{
	unsigned int a = 0xfffffff7;
	  char i = (unsigned char)a;
	unsigned char *b = ( unsigned char *)&a;
	printf("%08x,%08x",i,*b);
	getchar();
	return 0;
} 

只有在有符号的时候 ,才会出现fffff,而是用无符号时,则显示为00000f7
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值