UnsafeMutablePointer
上述计划的输出为#include <iostream>
int main()
{
int a = 999999999999999999;
std::cout << a << std::endl;
std::cout << 999999999999999999 << std::endl;
return 0;
}
和-1486618625
。
在999999999999999999
我们给出相同的数字,那么为什么输出不同?
cout
与long long int a=999999999999999
相同吗?
答案 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=999999999999999
与int 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的阶乘)。