使用 C 中的强制转换将 uint16_t 转换为 uint8_t[2] 是否有效?

问题描述 投票:0回答:2

我正在尝试创建一个函数,将 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 中的类型转换?

c pointers type-conversion
2个回答
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
投票

不。可能存在对齐问题。从技术角度来说,它违反了严格的别名要求。

使用

memcpy
、轮班或并集。如果可能的话,一个像样的编译器会将其优化为简单的移动指令。

memcpy( out, &in, 2 );

(即使这也不是最大程度的便携,因为它假设

CHAR_BIT
是 8。)

© www.soinside.com 2019 - 2024. All rights reserved.