我的代码依赖于 uint16_t、int32_t / uint32_t 和 int64_t 值混合的数据。它还包括一些较大的位移常量(例如,1
在计算 int64_t 值时,如果我仔细地转换每个子部分(例如,将 uint16_t 值向上转换为 int64_t),它就会起作用 - 如果我不这样做,计算通常会出错。
我最终得到的代码如下所示:
int64_t sensDT = (int64_t)sensD2-(int64_t)promV[PROM_C5]*(int64_t)(1<<8);
temperatureC = (double)((2000+sensDT*(int64_t)promV[PROM_C6]/(1<<23))/100.0);
不过,我想知道我在这里使用的字体是否太混乱、太慷慨了。我不确定 1
编辑:所以很明显,我问的是最小适当的转换量是多少 - 正确的功能需要什么(为了清楚起见,可以添加更多转换或修饰符,但从编译器的角度来看,确保正确计算需要什么?)
Edit2:我使用 C 风格的转换,因为这是来自 Arduino 类型的嵌入式代码库(它本身已经使用了这种风格的转换)。从达到预期效果的角度来看,它们似乎是等效的,因此我使用了现有的编码风格。
一般来说,您可以依靠整数提升来为您提供正确的操作,只要每个运算符的操作数之一具有正确的大小。所以你的第一个例子可以简化:
int64_t sensDT = sensD2-(int64_t)promV[PROM_C5]*(1<<8);
请仔细考虑优先规则,以了解运算符的应用顺序!
如果混合相同大小的有符号和无符号类型,则可能会遇到麻烦,尽管其中任何一个都应该升级为更大的有符号类型。
您需要小心常量,因为如果没有任何修饰,这些常量将是默认的整数大小和带符号的。1<<8
不会有问题,但是1<<35
可能会;你需要1LL<<35
.
当有疑问时,一些额外的转换或括号不会有什么坏处。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)