整型变量不能存储大的值
int variable is not able to store large values
#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
是否与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=999999999999999
和int 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).
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 如果静态变量只为程序的整个部分存储了一个副本,为什么我不能使用静态变量交换 2 个数字?
- 不能使用嵌套结构中的联合元素作为 scanf() 的参数来存储所需的值
- 一个对象什么时候可以有非零大小的一个,但不能同时具有一个或多个字节的存储
- 流的奇怪问题.不能存储具有特定值的成员变量的对象
- C++为什么字符串的地址尽管是十六进制格式,但不能存储在 long int 变量中?
- 为什么使用预留分配存储后不能迭代和打印矢量的内容?
- 为什么我不能将对象存储在unordered_set中?
- 不能存储太长的 int 类型
- 为什么存储指向内部内存的纯指针的结构不能存储在stxxl容器中
- 显式模板专用化不能具有存储类 - 成员方法专用化
- 为什么我不能在SERVICE_TABLE_ENTRY中存储 lambda 函数?
- 模板基类可以存储指向派生但不能存储对象的指针 - 为什么
- 整型变量不能存储大的值
- 静态函数:这里不能指定存储类
- 为什么我的 64 位计算机不能在 C++ 中存储双精度数字 2^1024?
- 在不能存储值的情况下计算序列
- QPixmap不能使用存储在变量中的图像路径
- 为什么我们不能总是在 C 中使用寄存器存储类?