如何在C中将无符号字符作为2位十六进制值打印?

时间:2012-09-10 02:42:49

标签: c keil

我正在尝试将unsigned char值打印为2位十六进制值,但始终将结果作为4位十六进制值,不确定我的代码有什么问题。

// unsigned char declaration
unsigned char status = 0x00;
// printing out the value 
printf("status = (0x%02X)\n\r", (status |= 0xC0));

我期待2位数的十六进制结果为0xC0,但我总是得到0xC0FF

同样,当我尝试使用%bu格式标识符打印相同的变量(status)作为unsigned char时,我得到了255的输出。

如何将两个十六进制字符作为输出?

4 个答案:

答案 0 :(得分:16)

据我所知,Keil C compiler并不完全符合C标准。如果是这样,它可能不会完全遵循标准的促销规则,例如将char值传递给可变函数;在8位CPU上,没有自动将8位值扩展到16位或更多位置的性能优势。

作为一种变通方法,您可以在将参数传递给printf之前显式截断高位。试试这个:

#include <stdio.h>

int main(void) {
    unsigned char status = 0x00;
    status |= 0xC0;

    printf("status = 0x%02X\n", (unsigned int)(status & 0xFF));
    return 0;
}

使用0xFF执行按位“和”清除除最后8位之外的所有内容;转换为unsigned int 不应该,但它保证参数实际上是printf具有"%02X"格式的预期类型。

您还应该查阅有关类型促销和printf的任何非标准行为的实施文档。

答案 1 :(得分:3)

您要将char发送到需要int的格式字符串。 printf函数从堆栈中抓取另一个字节以填充它。尝试

 printf("%02X",(int)(status|0xC0));

答案 2 :(得分:1)

将其转换为unsigned char:

printf("status = (0x%02X)\n\r", (unsigned char)(status |= 0xC0));

答案 3 :(得分:0)

查看所有答案,我认为我们可能缺少另一种方法。

Christmas

如果使用%#04x small x,则输出将为b 0x small x前缀。 #井号指示函数打印0x。 04指示要输出多少个数字,如果输入为'0x0a',则将打印此数字;如果没有输入04,则将打印'0xa'。

在我的计算机Dell工作站中,输出与问题预期的一样。除非

const unsigned char chararr[]="abceXYZ";
for (int i=0; i< 7; ++i) {
    printf("%#04X %d %c\n", chararr[i], chararr[i], chararr[i]);
}
0X61 97 a
0X62 98 b
0X63 99 c
0X65 101 e
0X58 88 X
0X59 89 Y
0X5A 90 Z

通过示例更好地说明:

unsigned char status = 0x00;
printf("status = (0x%02X)\n\r", (status |= 0xC0));
// output
//status = (0xC0)
// is exactly expected by the original question. 
相关问题