在 C/C++ 中,混合类型整数数学所需的最小类型向上转换是多少?

In C/C++, what's the minimum type up-casting required for mixed-type integer math?

本文关键字:类型 小类 多少 转换 C++ 混合 数数 整数      更新时间:2023-10-16

我的代码取决于uint16_t,int32_t/uint32_t和int64_t value的数据。它还包括一些较大的位转移常数(例如1<< 23,甚至1< 33)。

在计算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&lt;&lt; 8是否需要演员阵容(尽管没有一个,1&lt;&lt; 23并不会导致错误的计算),但也许它们也是如此。对于这样的计算,在铸造值时有多少?

编辑:很明显,我要问什么是适当的铸件,正确的功能是什么(一个人可以添加更多的铸件或修饰符,以确保清晰度,但从编译器的角度来看,确保正确计算的必要条件是什么?)

edit2:我正在使用C风格的铸件,因为这是来自Arduino型嵌入式代码库(本身已经使用了铸件样式)。从具有所需效果的角度来看,它们似乎是等效的,因此我使用了现有的编码样式。

通常,您可以依靠整数促销来为您提供正确的操作,只要每个操作员的操作数之一具有正确的大小。因此,您的第一个示例可以简化:

int64_t sensDT = sensD2-(int64_t)promV[PROM_C5]*(1<<8);

请谨慎考虑优先规则,以了解将应用运营商的订单!

如果您要混合签名和未签名类型的相同尺寸的签名类型,尽管要么要促进更大的签名类型。

您需要谨慎使用常数,因为如果没有任何装饰,那将是默认的整数大小并签名。1<<8不会有问题,但是1<<35可能会;您需要1LL<<35

如有疑问,一些额外的演员或括号不会受伤。