我试图将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.
您正在向需要 int 的格式字符串发送一个字符。printf 函数从堆栈中抓取另一个字节以填充它。尝试
printf("%02X",(int)(status|0xC0));
Run Code Online (Sandbox Code Playgroud)
看看所有的答案,我想我们可能缺少另一种方法。
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)
| 归档时间: |
|
| 查看次数: |
50510 次 |
| 最近记录: |