在 C/C++ 中,混合类型整数数学所需的最小类型向上转换是多少?
In C/C++, what's the minimum type up-casting required for mixed-type integer math?
我的代码取决于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
。
如有疑问,一些额外的演员或括号不会受伤。
相关文章:
- 调用具有未标识类型的类的方法
- C++ 中模板化类型的类层次结构
- 根据模板类型选择类模板的成员类型?
- C++从抽象类型定义类成员
- 实例化具有不完整类型的类模板格式不正确(如果该类型是在之后定义的)
- 重载模板<类型名...>类的函数模板
- 在设计方面:重载vector类型的类成员的插入运算符
- 错误:使用 SWIG 的未知类型名称"类"
- 添加字符串类型的类成员会导致调用基类函数而不是子函数
- 包装任意类型/非类型模板类的模板类
- 使用相同方法但不同成员类型构建类的最佳方法
- 如何删除类内类类型的类成员指针
- 为什么我不能在同一行中定义两个相同类型的类的成员指针
- 如何仅从类类型推断类构造函数参数的类型
- 为什么要返回对小类成员的 const 引用?
- (C++);动态决定函数的类型(派生类)
- 具有容器变量类型的类模板
- 如何基于模板参数类型施放类模板
- 包含仅移动类型的类的构造函数应通过引用还是通过右值引用接收仅移动类型?
- 无法将类型为"类名 &"的非常量左值引用绑定到类型为"类名"的右值