我在C ++中创建此代码只是为了检查数据类型可以存储的最大整数 int 和 double 。
#include<iostream>
using namespace std;
int main() {
int a, b;
cin >> a;
b = a;
for(int c; a > 1; a = a * b)
cout << a << "\n";
};
当我在下面的代码中输入2时,打印的最大整数是1073741824。
我将代码更改为:
#include<iostream>
using namespace std;
double main() {
double a, b;
cin >> a;
b = a;
for(double c; a > 1; a = a * b)
cout << a << "\n";
};
第二个代码的输出从2快速打印到无穷大。 为什么代码不会停止在double的最大值?为什么它会在之前的代码中停止?
答案 0 :(得分:5)
溢出int
时的行为是未定义。因此,无法阐明可以存储在int
中的最大可能值。因此,我们必须依赖您的平台为您提供的常量:std::numeric_limits<int>::max()
是最大int
的值。
对于double
案例,从技术上讲,行为也是 undefined 。虽然如果你的平台实现IEEE754,那么+ Inf最终将通过重复乘以足够大的值来实现;略高于1 1 。您平台支持的最大double
+Inf
为std::numeric_limits<double>::max()
。
最后,main
不允许返回int
以外的任何内容。你的编译器没有警告过你吗?
1 “一点点”的实际值是std::numeric<double>::epsilon()
。 Acknowledge @YSC。
答案 1 :(得分:1)
我在C ++中创建此代码只是为了检查最大的整数int和双数据类型可以存储
这是您获得可以存储在数据类型中的最大值的方法:
a
即使定义明确,您的试用乘法也不会正确:它只会显示a
的最后一个值,使得实际最大值介于a*b
和{之间{1}}。
答案 2 :(得分:0)
为什么代码不会停在double的最大值?
因为infinity > 1
始终为真。
为什么它会在之前的代码中停止?
由于在您的平台上a
从0x40000000(十进制1073741824)翻转到0x80000000(十进制-2147483648)时未定义的行为(或平台特定行为),-2147483648 > 1
为false。