C 中的这个取消引用指针工作正常,但看起来不对

This dereferencing pointer in C works fine, but it looks wrong

这段C代码工作正常(编译器是GNU11)。我确信它可以改进,因为它给出了“取消引用类型双关指针”警告,但我不知道具体如何。

一个uint8_t数组包含4个字节组成一个浮点数。然后将这 4 个字节存储在一个 uint32_t 变量中,最后转换为一个 float 变量:

uint8_t  buffer[];
uint32_t aux = 0;
float    value;

/*buffer contains the response from a sensor, containing a floating point number divided in 4 bytes*/

aux   = aux | ((buffer[3] << 24) | (buffer[4] << 16));
aux   = aux | ((buffer[5] << 8)  | (buffer[6]));
value = (float)*((float*)&aux);

此代码是否会出现未定义的行为?我读到我可以使用“union”来消除警告,但这是否也会消除未定义的行为?

谢谢!

定义明确的类型双关方法是在不同类型的变量之间使用 memcpy。即

memcpy(&value, &aux, sizeof(float));

在启用优化和驻留在自动存储中的操作变量(即常规函数变量)的情况下,这将转化为零附加指令,因为编译器将在内部执行单个静态赋值。

编辑: 自 C99 以来,另一种明确定义的方法是使用 union 进行类型双关语:

union {
    uint8_t  u8[sizeof(float)/sizeof(uint8_t)];
    uint32_t u32[sizeof(float)/sizeof(uint32_t)];
    float    flt;
} float_type_punner;