c - C 中的解引用指针工作正常,但看起来错误

标签 c floating-point dereference

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

uint8_t 数组包含组成 float 的 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;

关于c - C 中的解引用指针工作正常,但看起来错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71601180/

相关文章:

c - C语言中如何统计单词出现的频率

assembly - NASM 中的 float 舍入

python - 将 float 转换为 int,以便保留所有信息或如何获取长 float 的长度

c++ - 如何从该指针获取指针指向的值的地址

c - 数组段错误

c - C 结构中的内存错误

c - rand() 中的不均匀分布(C 语言)

python - 在C中将Float转换为String,然后在Python中读取它

c - 代码片段的说明(结构)

C++菜鸟问题: pointers and overloaded []