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