为什么 "int" 不能与 "j" 正常工作,但 long long 工作正常?
Why is "int" not working correctly with "j" but long long is working fine?
这是我的代码 int j
:
void solve(){
unsigned long long n;
cin>>n;
unsigned long long sum = 0;
int j = 1;
for(int i=3;i<n+1;i+=2){
sum += ((4*i)-4)*(j);
j++;
}
cout<<sum<<"\n";
}
Input:
499993
Output:
6229295798864
但它给出了错误的输出,这是我的 long long j
代码,它工作正常:
void solve(){
int n;
cin>>n;
unsigned long long sum = 0;
long long j = 1;
for(int i=3;i<n+1;i+=2){
sum += ((4*i)-4)*(j);
j++;
}
cout<<sum<<"\n";
}
Input:
499993
Output:
41664916690999888
在这种情况下,j
的值远低于 499993
,后者在 int
范围内,但仍然无法正常工作。为什么会发生这种情况?
这里是 link 到实际的 problem。万一你想看看
注意 ((4*i)-4)*(j)
的结果是一个 int,因为 i
和 j
都是 int 类型。仅当将 ((4*i)-4)*(j)
添加到 sum
时,右侧才会提升为 unsigned long long。但是表达式 ((4*i)-4)*(j)
在被提升之前已经溢出了足够大的 int 类型的大小 n
。
但是,如果您将 i
或 j
中的任何一个更改为 unsigned long long,表达式 ((4*i)-4)*(j)
将被评估为 unsigned long long,安全地在大小限制内。
在表达式的第一个代码片段中
((4*i)-4)*(j)
赋值语句
sum += ((4*i)-4)*(j);
两个操作数 (4*i)-4)
和 (j)
的类型都是 int
。所以表达式的类型(操作数的普通类型)也是int
。但是 int
类型的对象不够大,无法存储结果值。所以这里就发生了溢出。
当 j
声明为 long long
类型时
long long j = 1;
那么上面表达式的常见类型也是long long
。这意味着由于通常的算术转换,此操作数 (4*i)-4)
也被转换为类型 long long
。并且这种类型的对象可以存储为输入数据提供的结果值。
您可以查看 int
和 long long
.
类型的对象中可以存储的最大值是多少
给你。
#include <iostream>
#include <limits>
int main()
{
std::cout << "The maximum value of an object of the type int is "
<< std::numeric_limits<int>::max()
<< '\n';
std::cout << "The maximum value of an object of the type long long is "
<< std::numeric_limits<long long>::max()
<< '\n';
return 0;
}
程序输出可能看起来像
The maximum value of an object of the type int is 2147483647
The maximum value of an object of the type long long is 9223372036854775807
这是我的代码 int j
:
void solve(){
unsigned long long n;
cin>>n;
unsigned long long sum = 0;
int j = 1;
for(int i=3;i<n+1;i+=2){
sum += ((4*i)-4)*(j);
j++;
}
cout<<sum<<"\n";
}
Input:
499993
Output:
6229295798864
但它给出了错误的输出,这是我的 long long j
代码,它工作正常:
void solve(){
int n;
cin>>n;
unsigned long long sum = 0;
long long j = 1;
for(int i=3;i<n+1;i+=2){
sum += ((4*i)-4)*(j);
j++;
}
cout<<sum<<"\n";
}
Input:
499993
Output:
41664916690999888
在这种情况下,j
的值远低于 499993
,后者在 int
范围内,但仍然无法正常工作。为什么会发生这种情况?
这里是 link 到实际的 problem。万一你想看看
注意 ((4*i)-4)*(j)
的结果是一个 int,因为 i
和 j
都是 int 类型。仅当将 ((4*i)-4)*(j)
添加到 sum
时,右侧才会提升为 unsigned long long。但是表达式 ((4*i)-4)*(j)
在被提升之前已经溢出了足够大的 int 类型的大小 n
。
但是,如果您将 i
或 j
中的任何一个更改为 unsigned long long,表达式 ((4*i)-4)*(j)
将被评估为 unsigned long long,安全地在大小限制内。
在表达式的第一个代码片段中
((4*i)-4)*(j)
赋值语句
sum += ((4*i)-4)*(j);
两个操作数 (4*i)-4)
和 (j)
的类型都是 int
。所以表达式的类型(操作数的普通类型)也是int
。但是 int
类型的对象不够大,无法存储结果值。所以这里就发生了溢出。
当 j
声明为 long long
long long j = 1;
那么上面表达式的常见类型也是long long
。这意味着由于通常的算术转换,此操作数 (4*i)-4)
也被转换为类型 long long
。并且这种类型的对象可以存储为输入数据提供的结果值。
您可以查看 int
和 long long
.
给你。
#include <iostream>
#include <limits>
int main()
{
std::cout << "The maximum value of an object of the type int is "
<< std::numeric_limits<int>::max()
<< '\n';
std::cout << "The maximum value of an object of the type long long is "
<< std::numeric_limits<long long>::max()
<< '\n';
return 0;
}
程序输出可能看起来像
The maximum value of an object of the type int is 2147483647
The maximum value of an object of the type long long is 9223372036854775807