c++ - 为什么 “int”无法与 “j”一起正常工作,但是long long可以正常工作吗?

标签 c++ int overflow long-integer long-long

这是我的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范围内,但仍然无法正常工作。为什么会这样呢?

这是实际problem的链接。万一你想看看。

最佳答案

注意((4*i)-4)*(j)的结果是一个int,因为ij都是int类型。仅当将((4*i)-4)*(j)添加到sum时,右侧才会提升为unsigned long long。但是表达式((4*i)-4)*(j)在提升之前已经溢出了足够大的n的int类型的大小。

但是,如果将ij中的任何一个更改为unsigned long long,表达式((4*i)-4)*(j)的值将被评估为unsigned long long,并且安全地在大小限制内。

关于c++ - 为什么 “int”无法与 “j”一起正常工作,但是long long可以正常工作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61817328/

相关文章:

c++ - 无法打开源文件 "sys/types.h", "sys/stat.h"

两个不同 vector 中的 C++ 相同对象

c++ - int 值通常什么时候转换为 unsigned?

java - 将 togglebutton boolean 值转换为整数值,然后在 TextView 中加在一起

css - Firefox 滚动条对使用溢出自动和指针事件无响应的单击无响应

html - 即使未设置高度也会出现垂直滚动条

c++ - 如何查找列表是否是另一个列表的子集?

python - isinstance(False, int) 返回 True

html - 用于填满屏幕并在其中包含长列表的网页的 CSS

c++ - 删除字符串 vector 中的重复字符串