这段代码只打印 LSB 部分
当然,buf[0] = reg; 只复制 8 位。
您得到的结果并没有明确定义,因为char 无法可靠地存储原始二进制文件。它可能会在您的系统上签名,然后您可能会因此而得到各种微妙的错误。
第 1 步是修复您的类型。摆脱 char 以及自制的车库标准整数类型,转而使用标准 C 类型:
#include <stdint.h>
uint16_t reg = 0x10A0u;
uint8_t buf [10];
然后决定数组的字节顺序。假设您希望索引 0 是最重要的字节,那么快速和脏版本如下所示:
buf[0] = reg >> 8;
buf[1] = reg;
这将适用于这种特定情况。然而,好的编译器会抱怨隐式提升和类似的东西。严格来说,您应该养成在进行任何类型的移位之前始终转换为 uint32_t 的习惯(假设 >=32 位系统)。我们可以使代码更加坚固,并像这样使警告静音:
buf[0] = ((uint32_t)reg >> 8) & 0xFFu;
buf[1] = ((uint32_t)reg >> 0) & 0xFFu;
此方法也可以安全地扩展到更大的类型。
此外,SO 和其他地方的各种庸医解决方案会告诉您为此使用 union 或字符指针。这样的解决方案使代码不必要地依赖字节序,而一无所获。即使跨不同字节序的 CPU,shift 版本也是 100% 可移植的。
最后,使用printf 打印。您可以从标头 inttypes.h 自动获取任何 uintn_t 的正确格式说明符。它为小写十六进制提供PRIx8,为大写十六进制提供PRIX8。
完整的程序:
#include <stdint.h>
#include <inttypes.h>
#include <stdio.h>
int main (void)
{
uint16_t reg = 0x10A0u;
uint8_t buf[10];
buf[0] = ((uint32_t)reg >> 8) & 0xFFu;
buf[1] = ((uint32_t)reg >> 0) & 0xFFu;
printf("0x%"PRIX8 "%"PRIX8 "\n", buf[0], buf[1]);
}