8位单片机CCS C代码ADC换算语句的强制类型转换是否需要调整?
结论
应该将最后一行的强制类型转换改为long类型,原代码中的long long强转属于多余操作,不符合你对SirenVolt的类型定义要求。
具体原因
- 运算结果完全在
long类型容纳范围内:read_adc()返回最大值为1024,代入计算可得结果最大值为(493 * 1024) / 100 = 5048,远小于unsigned int16(即CCS定义的long类型)的最大值65535,不存在溢出风险。 - 运算过程无溢出问题:
DummyVolt是long long(unsigned int32)类型,493 * DummyVolt运算时会自动按32位无符号整数规则计算,中间结果最大值为504832,远低于32位无符号整数上限,不会出现运算中途溢出的问题。 - 原写法存在不必要开销:原代码先将运算结果强转为
long long,再隐式转换为long类型赋值给SirenVolt,多了一步无意义的类型转换,在资源有限的8位单片机上会增加额外的运算开销,完全可以优化。
修正后代码示例
long SirenVolt;//unsigned int16 long long DummyVolt;//unsigned int32 DummyVolt = read_adc();//该函数返回值范围固定为0到1024 SirenVolt = (long)((493 * DummyVolt) / 100);
内容的提问来源于stack exchange,提问作者E_Blue
相关产品推荐
相关产品推荐

