代码之家  ›  专栏  ›  技术社区  ›  gberth

使用强制转换将uint16_t转换为uint8_t[2]在C中有效吗?复制

  •  2
  • gberth  · 技术社区  · 2 年前

    我正在尝试创建一个函数来转换 uint16_t 进入 uint8_t[2] 在C。

    以下代码已经过测试,但即使在阅读了反汇编之后,我也不确定它是否可移植或安全。

    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中的打字?

    2 回复  |  直到 2 年前
        1
  •  6
  •   chqrlie    2 年前

    为此使用强制转换违反了严格的别名要求。

    您应该改为使用 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));
    } 
    
        2
  •  4
  •   ikegami Gilles Quénot    2 年前

    不会。这可能会违反对齐问题,也违反了严格的混叠要求。

    使用 memcpy 、轮班或工会。如果可能的话,一个好的编译器会将其优化为一个简单的移动指令。

    memcpy( out, &in, 2 );