这段 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/