int变量无法存储大值

时间:2015-09-21 07:26:07

标签: c++ integer literals

UnsafeMutablePointer

上述计划的输出为#include <iostream> int main() { int a = 999999999999999999; std::cout << a << std::endl; std::cout << 999999999999999999 << std::endl; return 0; } -1486618625

999999999999999999我们给出相同的数字,那么为什么输出不同?

coutlong long int a=999999999999999相同吗?

5 个答案:

答案 0 :(得分:0)

在第一种情况下,您要将值分配给int,这对于最大值为2147483647的整数来说太大了,请查看此链接以获取更多信息C++ Data Types

在第二种情况下,cout将打印你给出的任何值。

答案 1 :(得分:0)

将常数999999999999999999分配给int变量(a)会导致截断并更改该值。但是,如果您将其声明为 long long a ,则不会发生截断,并且它会在任何具有64位( long long )的平台上正确显示(即Windows VC ++)

答案 2 :(得分:0)

当您将整数文字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;
             ^

要回答您的问题,&#34; [是] long long int a=999999999999999int a=9999999999999999ll&#34;相同 - 为什么不亲自测试一下?像这样,也许:

#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

答案 3 :(得分:0)

变量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,然后打印输出将成功。

答案 4 :(得分:-2)

首先,您将a声明为int类型的变量。 int类型的最大值为2147483647,因此无论上面的值是什么,它都将被转换。所以你的长期价值被转换和存储,那就是印刷的东西。但是当你直接给它没有任何值时,它可以是任何数据类型。这里的数据类型是long long int(64位int)。因此,如果您的编译器,操作系统和硬件支持64位整数,那么它将被打印。如果您将其声明为long long int,则第一个也将正确打印。 long long int的最大值为 92233703685477807 ,这几乎足以存储 20!(20的阶乘)。