我尝试了以下代码
#include <iostream>
#include <limits>
using namespace std;
cout << numeric_limits<int>::min() << endl;
cout << numeric_limits<int>::max() << endl;
cout << numeric_limits<double>::min() << endl;
cout << numeric_limits<double>::max() << endl;
哪个输出
-2147483648
2147483647
2.22507e-308
1.79769e+308
为什么最小双倍数不是最大双倍数的(-1)?对于整数而言,第一位用作符号(这可能就是为什么max integer的绝对值低于min integer的绝对值,对吗?)。负 double 字是如何描述的,因为对我而言,似乎8个双字节中的任何一个都不负责该符号。到现在为止,我读到的浮点数是对称的。我不太明白这一点,因为整数值也应该对称吗?
有人可以为业余爱好者解释吗?
最佳答案
对于整数类型,与您的信念相反,没有要求第一位代表符号。在现实世界中,这肯定是不正确的。
关于整数类型可能具有不同大小的最小值和最大值(即,一个不是另一个的负数)的原因....当前编译器的典型实现选择是用某些特定位数表示整数类型。可能的不同值的数量(位值的可能的不同组合)的数量增加了2
。因此,8
位signed char
可以表示256
(到2
的8
)不同的值,16
位int可以表示65536
不同的值,32
位int可以表示14294967296
不同的值。请注意,所有这些值都是偶数。可表示的值之一将为零,留下奇数数量的其他不同值。这要么意味着必须将值加倍(两个不同的位模式表示相同的值),要么(实际上是通常的实现选择),即最大值和最小值的大小不相等。顺便说一句,这也是std::numeric_limits::max()
通常为无符号整数类型给出奇数值的原因。
对于浮点,min()
的规格为最小的正值(幅值最小的正值),而max()
的规格最大。如果要使负值最远离零,请使用(自C++ 11起)std::numeric_limits<float>::lowest()
。