码迷,mamicode.com
首页 > 其他好文 > 详细

0x%02x 字符型的16进制输出

时间:2016-03-29 16:19:37      阅读:154      评论:0      收藏:0      [点我收藏+]

标签:

问题:将一个字符类型按16进制输出,输出格式为0xab, 0x后面要求是2位,不够2位则补0,比如“0x0b”。

常见的错误做法是:

  1. #include <stdio.h>  
  2. int main()  
  3. {  
  4.     char a = 0x41; // a = ‘A‘  
  5.     printf( "the hex value of a is 0x%02x\n", a );  
  6.     return 0;  
  7. }  

如果a = 0xf1,上面的输出将是 0xfffffff1 而不是 0xf1。

究其原因,%x 是 unsigned int  或  int  型输出 ,所以 printf("%x", a) 在执行时将自动将 a 类型提升(char 将提升至 int;

unsigned char 将提升至 unsigned int), 注意到 char 是 signed(有符号的),

如果这时 a 是负数 ,在提升的时候前面将会补1 ,即象反例中的 0xf1 => 0xfffffff1;而unsigned char 在提升的时候只会补0。

 

解决方法1. 强制类型转换

  1. #include <stdio.h>  
  2. int main()  
  3. {  
  4.     char a = 0xf1;  
  5.     printf( "the hex value of a is 0x%02x\n", (unsigned char)a );  
  6.     return 0;  
  7. }  

 

方法2. 精确打印格式

  1. #include <stdio.h>  
  2. int main()  
  3. {  
  4.     char a = 0xf1;  
  5.     printf( "the hex value of a is 0x%02hhx\n", a );  
  6.     return 0;  
  7. }  

hh 将会将 int 转化成 char;unsigned int 转化成 unsigned char。具体可以 man 3 printf 查看详情。

Shell代码 
  1. hh     A following integer conversion corresponds to a signed char or unsigned char argument,
  2.  or a following n conversion corresponds to a pointer to a signed char argument.  

方法3. 强制位数为 1 byte

  1. #include <stdio.h>  
  2. int main()  
  3. {  
  4.     char a = 0xf1;  
  5.     printf( "the hex value of a is 0x%02x\n", (a&0xff) );  
  6.     return 0;  
  7. }  

上面隐含过程是:先将 char a 提升至 int,然后再与 0xff 相与。

 

0x%02x 字符型的16进制输出

标签:

原文地址:http://www.cnblogs.com/YPHFree/p/5333253.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!