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

Asa*_*eed 7 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));
Run Code Online (Sandbox Code Playgroud)

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

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

你如何得到两个十六进制字符作为输出?

Kei*_*son 16

据我所知,Keil C编译器并不完全符合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;
}
Run Code Online (Sandbox Code Playgroud)

做一个按位"和" 0xFF清除除了最后8位之外的所有内容; 转换到unsigned int 不应该是必要的,但它保证参数实际上printf"%02X"格式所期望的类型.

您还应该查阅您的实施文档,了解类型促销的任何非标准行为printf.

  • 除非编译器比没有隐式地将char参数转换为int更破坏,否则不应该使用`&0xFF`.0xC0FF的输出表明它实际上没有进行转换,并从堆栈中的垃圾箱中取出其他8位或在寄存器中遗留下来.但是好的捕获+1. (2认同)

ASh*_*lly 7

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

 printf("%02X",(int)(status|0xC0));
Run Code Online (Sandbox Code Playgroud)


Kem*_*hou 5

看看所有的答案,我想我们可能缺少另一种方法。

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
Run Code Online (Sandbox Code Playgroud)

如果您使用 %#04x 小 x,则输出将为 b 0x 小 x 前缀。# 井号告诉函数打印 0x。04 指示输出多少位,如果输入是 '0x0a' 则打印此内容,没有 04 则打印 '0xa'。

在我的计算机戴尔工作站中,输出符合问题的预期。除非

unsigned char status = 0x00;
printf("status = (0x%02X)\n\r", (status |= 0xC0));
// output
//status = (0xC0)
// is exactly expected by the original question. 
Run Code Online (Sandbox Code Playgroud)

通过例子更好地说明:

 37    printf("status = (%#02x)\n", (status |= 0xC0));
 38    printf("status = (%#04x)\n", (status |= 0xC0));
 39    printf("status = (%#04x)\n", 0x0f);
 40    printf("status = (%#02x)\n", 0x0f);
status = (0xc0)
status = (0xc0)
status = (0x0f)
status = (0xf)
Run Code Online (Sandbox Code Playgroud)