合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
在C语言中,进行类型之间的转换有两种转换方式:隐式类型转换 和 强制类型转换。其中强制类型转换是由开发人员完成的,比如float val = (float)u8; 一般不会出现问题,所以我们重点关心隐式类型转换。 ### 隐式类型转换是由编译器主动完成的,如果由低类型到高类型的隐式类型转换是安全的,不会发生截断;相反由高类型到低类型的隐式类型转换是不安全的,会发生截断产生不正确的结果: ![](https://img.kancloud.cn/53/94/5394a672931b734b37a6596512e2ad80_832x246.png =600x) ### 四种情况下会发生隐式类型转换:赋值,算术运算,函数传参,函数返回值。 在源码文件:main\_3.c中,我们列出了四种情况的例子: ![](https://img.kancloud.cn/a8/44/a844593f4bb181452bf2ee4d8d8ea556_734x1026.png =600x) ### **1.赋值** 图中我们定义的类型uint8\_t u8,并赋值为250;同时定义int8\_t i8,然后把u8赋值给i8,显然这个过程出现类型不匹配的转换,由于250已经超过i8的最大范围,因此i8不在是数值250了。 ### **2.算术运算** 两个uint8\_t类型相加,赋值给uint16\_t,实际上编译器在执行该条指令时,会把两个uint8\_t先转换为uint16\_t,所以图中: ``` uint16_t both = cal_1 + cal_2; 等价于: uint16_t both = (uint16_t)cal_1 + (uint16_t)cal_2; ``` 隐式类型转换后数据正确。 ### **3.函数传参** 函数add的参数类型都是int8\_t,而我们传入的200已经超过最大范围,因此传入的数据发生大类型到小类型的转换;同时函数返回值是int8\_t,两个超过范围的int8\_t相加得不到200+200=400的数值,如果相加也出现溢出,那么返回值更加不可测了。 ### **4.函数返回值** 函数add2的参数和返回值都是uint16\_t,我们传入的两个uint8\_t被转换为uint16\_t,运算结果数值也是uint16\_t,因此返回数值正确。 编译运行: ![](https://img.kancloud.cn/5c/d8/5cd868d1ec36f10a7b70395ad0f66850_832x222.png =600x) ### 在编写程序的过程中,我们需要留意可能存在隐式类型转换的地方,避免由于数据类型转换导致的结果不可预测。