要使用表达式打印大整数,为什么我们也需要将初始变量声明为long

问题描述 投票:0回答:1

所以基本上我有一个我想要的代码

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 而不是先将其存储在变量中,也会发生这种情况。

c++ long-integer cout
1个回答
0
投票

考虑以下程序,其中 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 字节整数(这可以防止溢出)

    

© www.soinside.com 2019 - 2024. All rights reserved.