我正在尝试创建一个函数,将 C 中的
uint16_t
转换为 uint8_t[2]
。
以下代码已经过测试,但即使在阅读反汇编之后,我也不确定它是否可移植或安全。
static inline uint8_t* write_u16(uint16_t in, uint8_t out[2], ArchEndian_t endian) {
if (NATIVE_ENDIAN != endian){
in = byte_swap(in);
}
*((uint16_t*)out) = in; //< Is this portable and safe?
return out;
}
我应该如何考虑 C 中的类型转换?
为此使用强制转换违反了严格的别名要求。
您应该这样使用
memcpy
:
#include <string.h>
#include <stdint.h>
static inline uint8_t *write_u16(uint16_t in, uint8_t out[2], ArchEndian_t endian) {
if (NATIVE_ENDIAN != endian) {
in = byte_swap(in);
}
return memcpy(out, &in, sizeof(in));
}
不。可能存在对齐问题。从技术角度来说,它违反了严格的别名要求。
使用
memcpy
、轮班或并集。如果可能的话,一个像样的编译器会将其优化为简单的移动指令。
memcpy( out, &in, 2 );
(即使这也不是最大程度的便携,因为它假设
CHAR_BIT
是 8。)