这个双重选角有什么意义?

问题描述 投票:0回答:1

我在这里找到了从

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]
),然后转换为新的大小。

这是正确的吗?如果是,为什么?如果不是,为什么会投射两次?

c casting
1个回答
0
投票

我认为,当

bmp180_cal_data
中的值高于
INT16_MAX
时,基于特定于实现的行为,这是尝试做“正确”的事情。在这种情况下,将其转换为
int16_t
取决于实现,但常见行为是仅以二进制补码格式解释位,因此它将环绕为负数(与将有符号转换为无符号时处理负数的方式相反) )。然后它使用第二次转换将其扩展为 32 位,这将保留负数。

如果它们直接转换为

int32_t
,那么大的 16 位数字将只保留其原始值,因为它们适合 32 位,而不是变成负数。

因此,如果原始值为

65535
,则使用双重转换时将变为
-1
,但使用单次转换时将保持
65535

© www.soinside.com 2019 - 2024. All rights reserved.