C++用int计算long long

C++ calculation of long long with int

下面你可以找到我的一个盒子的 C++ 代码的一部分 class。 当我想计算

的体积时

l=1039 b=3749 h=8473

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

其他两个计算结果为 -1355615565。 有人可以帮我理解为什么会这样吗?

    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