gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 17:44:45 25 4
gpt4 key购买 nike

我的代码依赖于混合了 uint16_t、int32_t/uint32_t 和 int64_t 值的数据。它还包括一些更大的位移常量(例如,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<<8 是否需要强制转换(尽管没有强制转换,但 1<<23 不会导致错误计算)但也许他们也需要。当涉及到像这样的计算的向上转换值时,多少算太多?

编辑:所以很明显,我问的是最少适当的转换量是多少 - 正确功能所必需的(为了清楚起见,可以添加更多转换或修饰符,但从编译器的角度来看,确保正确计算所必需的是什么? )

Edit2:我使用的是 C 风格的强制转换,因为这是来自 Arduino 类型的嵌入式代码库(它本身已经使用了那种强制转换风格)。从达到预期效果的角度来看,它们似乎是等价的,因此我使用了现有的编码风格。

最佳答案

通常,您可以依靠整数提升来为您提供正确的运算,只要每个运算符的操作数之一具有正确的大小。所以你的第一个例子可以简化:

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

请仔细考虑优先规则以了解运算符的应用顺序!

如果混合大小相同的有符号和无符号类型,您可能会遇到麻烦,尽管其中任何一个都应该提升为更大的有符号类型。

你需要小心常量,因为如果没有任何装饰,它们将是默认的整数大小和有符号。 1<<8不会有问题,但是1<<35可能会;你需要1LL<<35 .

当有疑问时,一些额外的转换或括号不会有什么坏处。

关于c++ - 在 C/C++ 中,混合类型整数数学所需的最小类型向上转换是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37995823/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com