Eng*_*999 1 c unsigned signed casting type-conversion
请参阅我下面的代码。我很困惑为什么我需要先将变量转换var_u16
为int16_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)
这里发生的情况是,该值从无符号 16 位数字转换为有符号 32 位数字。底层表示不相关。
由于任何可以存储在 an 中的值uint16_t
也可以存储在 an 中int32_t
,因此当转换为新类型时,该值不会改变。因此,uint16_t
值为 32768 的 a 变为int32_t
值为 32768 的 a。
中间转换后情况发生了变化,int16_t
因为值 32768 无法存储在该类型中,因此该值会经历实现定义的转换,导致类型的表达式int16_t
具有值 -32768。
归档时间: |
|
查看次数: |
7914 次 |
最近记录: |