我在这里找到了从
uint16_t
到int32_t
的这些转换https://gist.github.com/mux2000/5a0db5be900ca8b7f2d528fb37968b38。
int32_t ac6 = (int32_t)(int16_t)bmp180_cal_data[AC6],
ac5 = (int32_t)(int16_t)bmp180_cal_data[AC5],
mc = (int32_t)(int16_t)bmp180_cal_data[MC],
md = (int32_t)(int16_t)bmp180_cal_data[MD];
bmp180_cal_data
是 uint16_t
的数组。因此,当从不同大小的无符号数转换为有符号数(反之亦然)时,应首先转换为原始值的大小(在本例中为bmp180_cal_data[x]
),然后转换为新的大小。
这是正确的吗?如果是,为什么?如果不是,为什么会投射两次?
我认为,当
bmp180_cal_data
中的值高于 INT16_MAX
时,基于特定于实现的行为,这是尝试做“正确”的事情。在这种情况下,将其转换为 int16_t
取决于实现,但常见行为是仅以二进制补码格式解释位,因此它将环绕为负数(与将有符号转换为无符号时处理负数的方式相反) )。然后它使用第二次转换将其扩展为 32 位,这将保留负数。
如果它们直接转换为
int32_t
,那么大的 16 位数字将只保留其原始值,因为它们适合 32 位,而不是变成负数。
因此,如果原始值为
65535
,则使用双重转换时将变为 -1
,但使用单次转换时将保持 65535
。