C++计算具有int的long-long



在下面,您可以找到一个box类的C++代码的一部分。当我想计算的音量时

l=1039b=3749h=8473

我要33004122803。不幸的是,我不明白为什么只有第一个实现(CalculateVolume1(给出了正确的答案。

另外两个计算结果为-135615565。有人能帮我理解为什么会这样吗?

class Box{
private:
int l,b,h;
public:
//works
long long CalculateVolume1() { return (long long) l*b*h;} 
// does not work
long long CalculateVolume2() { return long long v = l*b*h;} 
//does not work
long long CalculateVolume3() 
{ 
long long v = long long (l)* long long(b)* long long (h);
return v;
}
};

在第一个(long long) l*b*h中,强制转换应用于l,就像它被写入((long long)l)*b*h一样。因此l被转换为long long。由于乘法运算中的一个因子是long long,因此其他两个因子被提升为long long,并且乘法运算的结果是正确的。

"固定";第二个和第三个中的语法错误

long long v = l*b*h;

这里,所有三个因子的类型都是int,因此在ints上进行乘法运算,结果溢出。

long long v = (long long)l*(long long)b*(long long)h;

这与第一个基本相同:这三个因子都被提升为long long,这一次是通过对这三个因素进行显式强制转换,因此使用long long算法计算结果,结果符合。

编写的第二个问题是不能在return语句中定义变量。所以

return long long v = l; // illegal

应该是:

long long v = l;
return v;

第三个问题是,函数样式转换必须有一个单词的名称:

long long v = int(l); // okay, but pointless
long long v = long long(l); // error, invalid name

可能是:

typedef long long my_type;
long long v = my_type(l); // okay