所以基本上我有一个我想要的代码
get the cube of the given integer
输入可以和 10^6
一样大,所以当我使用 long long int 和 size_t 时,它们不起作用
直到我一时兴起将输入的数据类型更改为long long。
有人可以解释一下为什么会发生这种情况吗?
#include <bits/stdc++.h>
using namespace std;
int main(){
long long t;cin>>t;
long long ans=t*t*t;
cout<<ans;
return 0;
}
即使简单地使用 cout 而不是先将其存储在变量中,也会发生这种情况。
考虑以下程序,其中 t 被声明为 4 字节整数:
#include <iostream>
using namespace std;
int main(){
int t;
cin>>t;
long long ans= t*t*t;
cout<<ans;
return 0;
}
当我按照您的说明输入 1,000,000 时,我收到了错误的值:
1000000
-1486618624
由于
t
是一个4字节整数,乘法t*t*t
将返回一个4字节整数,然后在ans中移动时隐式转换为8字节整数
但是,由于 4 字节整数只能存储最多
2,147,483,647
和 (10^6)^3 > 2,147,483,647
的值。这会导致乘法中出现溢出错误,产生错误的负值,然后在将其移入 ans 时将其转换为 8 字节整数(其中仍保留此错误值)。
但是,更改
t
的声明,使其成为 long long
:
long long t
long long
是一个8字节整数,因此乘法t*t*t
将返回一个8字节整数,然后移入ans。
8 字节整数可以存储最多
18,446,744,073,709,551,615
和 (10^6)^3 < 18,446,744,073,709,551,615
的值,因此它们不会溢出,并且会正确输出 '1,000,000,000,000,000,000`。
或者,您可以将
t
保留为 int
并显式地将乘法 t*t*t
转换为 long long,如下所示:
int t; cin>>t;
long long ans= (long long) t*t*t;
我相信这明确告诉编译器将乘法的结果存储为 8 字节整数而不是 4 字节整数(这可以防止溢出)