整型变量不能存储大的值

int variable is not able to store large values

本文关键字:存储 不能 整型变量      更新时间:2023-10-16
#include <iostream>
int main()
{
    int a = 999999999999999999;
    std::cout << a << std::endl;
    std::cout << 999999999999999999 << std::endl;
    return 0;
}

上述程序的输出为-1486618625999999999999999999

在两个cout中,我们给出了相同的数字,那么为什么输出不同?

long long int a=999999999999999是否与int a=9999999999999999ll相同?

当您将整型文字999999999999999999赋值给int a时,如果int类型不能表示该数字,则可能会被截断。可以存储在int中的最大值是std::numeric_limits<int>::max(),这取决于您正在编译的平台(但必须至少为32767)。你的编译器应该警告你这样的截断赋值:

$ g++ -std=c++11 -Wall -Wextra    32689548.cpp   -o 32689548
32689548.cpp: In function ‘int main()’:
32689548.cpp:5:13: warning: overflow in implicit constant conversion [-Woverflow]
     int a = 999999999999999999;
             ^

回答你的问题,"[是]long long int a=999999999999999int a=9999999999999999ll一样"-为什么不自己测试一下呢?例如:

#include <iostream>
int main()
{
    long long int a = 999999999999999999;
    int b = 999999999999999999ll;
    std::cout << a << std::endl;
    std::cout << b << std::endl;
    std::cout << (a==b) << std::endl;
    return 0;
}
$ g++ -std=c++11 -Wall -Wextra    32689548.cpp   -o 32689548
32689548.cpp: In function ‘int main()’:
32689548.cpp:6:13: warning: overflow in implicit constant conversion [-Woverflow]
     int b = 999999999999999999ll;
             ^
$ ./32689548
999999999999999999
-1486618625
0

在这里,我们看到将long long赋值给int b会导致相同的截断(正如GCC警告的那样)。然而,如果我们将int b更改为auto b,那么我们将不会得到任何警告和真正的比较:

999999999999999999
999999999999999999
1
为了方便起见,我在一个具有 的系统上构建并运行了上面的代码。
std::numeric_limits<int>::max() = 2147483647
std::numeric_limits<long long int>::max() = 9223372036854775807

在第一种情况下,你将值分配给int,这对于最大值为2147483647的整数来说太大了,查看此链接了解更多信息c++数据类型

在第二种情况下,cout将打印你给定的值

将常数99999999999999999999赋值给int变量(a)会导致截断并改变值。但是,如果您将其声明为long long a,则不会截断,并且在任何具有64位long long(即Windows vc++)的平台上都能正确显示。

变量a定义为有符号整数数据类型- 4字节,有符号整数的取值范围为[-2^ 31,2 ^31]。为了便于理解,数据类型的值被存储为圆形,这样最小值就在最大值旁边[..],max-1, max, min, min+1…]。它表示(最大值+ 1)的值是最小值。当你作为int a=999999999999999进行赋值时,因为这个值是有符号整型数据类型的范围值,所以整数的范围值中的一个有效值被赋给变量a。

行语句cout<<a<<std::endl;本质上是对std操作符basic_ostream<charT,traits>& operator<<(int n)的重载——输出一个有符号整数值

行语句cout<<999999999999999999;是超载basic_ostream<charT,traits>& operator<<(long n),长数据类型为8字节数据类型,取值范围包含打印值'99..99',所以值'99..99'是毫无疑问的。

尝试将var a定义为长数据类型long a = 999999999999999999,然后打印将成功。

首先,您将a声明为int类型的变量。int类型的最大值是2147483647,所以无论上面的值是什么,它都会被转换。所以你的long值被转换并存储,这就是打印的内容。但是当你不带任何值直接给它时,它可以是任何数据类型。这里的数据类型是long long int(64位整型)。所以如果你的编译器、操作系统和硬件支持64位整型,那么它就会被打印出来。如果将第一个声明为long long int,它也将正确打印。long long int的最大值是92233703685477807,几乎足够存储20! (factorial of 20).