我正在从Java过渡到C++,并对long数据类型有一些疑问.在Java中,要保存大于2 32的整数,您只需编写long x;.但是,在C++中,它似乎long既是数据类型又是修饰符.
似乎有几种使用方法long:
long x;
long long x;
long int x;
long long int x;
Run Code Online (Sandbox Code Playgroud)
此外,似乎有一些事情,如:
long double x;
Run Code Online (Sandbox Code Playgroud)
等等.
所有这些不同的数据类型之间有什么区别,它们都有相同的目的吗?
我的代码依赖于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);
Run Code Online (Sandbox Code Playgroud)
不过,我想知道,如果我在这里撒上类型的石膏太杂乱而且太慷慨了.我不确定1 << 8是否需要演员(虽然没有一个,1 << 23不会导致错误的计算),但也许他们也这样做.对于像这样的计算的上升值,多少钱太多了?
编辑:所以很清楚,我问的是最小适当的投射量是什么 - 正确功能需要什么(为了清晰起见,可以添加更多的投射或修改器,但从编译器的角度来看,确保正确计算的必要性是什么?)
EDIT2:我使用C-风格转换,因为这是从一个Arduino型嵌入代码库(其本身使用的铸件这种风格的话).从具有期望效果的角度来看,它们看起来是等效的,因此我使用了现有的编码风格.