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
,所以在int
s上进行乘法运算,结果溢出。
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
下面你可以找到我的一个盒子的 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
,所以在int
s上进行乘法运算,结果溢出。
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