从 uint16_t 到 int32_t 的转换需要中间转换为 int16_t

Eng*_*999 1 c unsigned signed casting type-conversion

请参阅我下面的代码。我很困惑为什么我需要先将变量转换var_u16int16_t ,然后再转换为int32_t以便在 MyFunc() 中正确解释为有符号 int。

我本以为,由于var_u16最高有效位为 1,当简单地转换为 int32_t 时编译器会理解这是一个负值。

相反,它仍然被解释为无符号值。为什么需要先中间转换为int16_t

我正在使用 gcc 8.3.0

#include <stdio.h>

void MyFunc(int32_t s32Var)
{
    printf("%d\n", s32Var);
}

int main()
{
    uint16_t var_u16 = 0x8000;
    MyFunc((int32_t)var_u16);          // prints 32768  
    MyFunc((int32_t)(int16_t)var_u16); // prints -32768 

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

dbu*_*ush 6

这里发生的情况是,该从无符号 16 位数字转换为有符号 32 位数字。底层表示不相关。

由于任何可以存储在 an 中的值uint16_t也可以存储在 an 中int32_t,因此当转换为新类型时,该值不会改变。因此,uint16_t值为 32768 的 a 变为int32_t值为 32768 的 a。

中间转换后情况发生了变化,int16_t因为值 32768 无法存储在该类型中,因此该值会经历实现定义的转换,导致类型的表达式int16_t具有值 -32768。