我尝试了以下代码

#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。因此,8signed char可以表示256(到28)不同的值,16位int可以表示65536不同的值,32位int可以表示14294967296不同的值。请注意,所有这些值都是偶数。可表示的值之一将为零,留下奇数数量的其他不同值。这要么意味着必须将值加倍(两个不同的位模式表示相同的值),要么(实际上是通常的实现选择),即最大值和最小值的大小不相等。顺便说一句,这也是std::numeric_limits::max()通常为无符号整数类型给出奇数值的原因。

对于浮点,min()的规格为最小的正值(幅值最小的正值),而max()的规格最大。如果要使负值最远离零,请使用(自C++ 11起)std::numeric_limits<float>::lowest()

07-24 09:46
查看更多