为什么这里需要显式类型转换?
Why explicit typecasting is required here?
为什么我们明确需要在乘法中将 int
类型转换为 long long
?
t=(long long)n*(long long)n
给出了正确答案但是
t=n*n
给出错误答案:
#include <iostream>
using namespace std;
int main() {
int n=100000;
long long int t;
t=(long long)n*(long long)n;
//t=n*n (This gives wrong answer)
printf("%lld",t);
return 0;
}
t=(long long)n*(long long)n
给出 10000000000
然而
t=n*n
给出 1410065408
为什么会这样?
因为n
是int
类型,所以n * n
也是int
类型。 C++中没有"dynamic widening"。
写入 1LL * n * n
会强制将 n
隐式转换为 long long
类型。
最后,请注意即使 100000
也可能 对于 int
- std::numeric_limits<int>::max()
可能小到 32767 来说太大了。如果您希望您的代码 可移植 您需要编写 long n = 100000;
和给定的 t
的表达式。
为什么我们明确需要在乘法中将 int
类型转换为 long long
?
t=(long long)n*(long long)n
给出了正确答案但是
t=n*n
给出错误答案:
#include <iostream>
using namespace std;
int main() {
int n=100000;
long long int t;
t=(long long)n*(long long)n;
//t=n*n (This gives wrong answer)
printf("%lld",t);
return 0;
}
t=(long long)n*(long long)n
给出 10000000000
然而
t=n*n
给出 1410065408
为什么会这样?
因为n
是int
类型,所以n * n
也是int
类型。 C++中没有"dynamic widening"。
写入 1LL * n * n
会强制将 n
隐式转换为 long long
类型。
最后,请注意即使 100000
也可能 对于 int
- std::numeric_limits<int>::max()
可能小到 32767 来说太大了。如果您希望您的代码 可移植 您需要编写 long n = 100000;
和给定的 t
的表达式。