通过在 c 中进行转换,将较大尺寸的变量 unit16 复制到等效的较小数组尺寸 unint8

moh*_*mnd 4 c stm32 i2c mcu

我有变量uint16_t value,我想将其复制到uint8_t buffer[3]. 是否可以这样做(小端):

*buffer=*(uint8_t *)&value;
Run Code Online (Sandbox Code Playgroud)

代替:

buffer[0] = highByte(value);
buffer[1] = lowByte(value);
Run Code Online (Sandbox Code Playgroud)

由于此替换导致 stm32f7 I2C 无法正常工作。有没有正确的铸造方法?

Lun*_*din 6

STM32 是小端字节序,因此您首先获得最低有效字节:

uint8_t* ptr = (uint8_t*)&value;
uint8_t low  = ptr[0];
uint8_t high = ptr[1];
Run Code Online (Sandbox Code Playgroud)

像这样进行强制转换和取消引用仅适用于字符类型。上面的代码假设uint8_t是字符类型,这很可能是这种情况(在 gcc 和其他主流编译器上)。

有关详细信息,请参阅什么是 CPU 字节顺序?

编辑:

如果您只想将 16 位数字复制到字节数组中,正确的解决方案是:

memcpy(buffer, &value, sizeof(uint16_t)).
Run Code Online (Sandbox Code Playgroud)

我们不能这样做*(uint16_t*) buffer=value;,因为它会调用未定义的行为。buffer可能会错位,这也是严格的别名违规。这就是为什么我在上面强调“这仅适用于字符类型”。