我尝试了以下代码
#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)乘以最大双倍? Afaik表示整数,第一位用作符号(这可能是为什么max integer的绝对值低于min整数的绝对值,是不是?)。如何描述负双打,因为对我而言,似乎8个双字节中没有一个负责该符号。直到现在,我读到浮点数是对称的。我不太明白这一点,因为整数值也应该是对称的?!
有人可以为业余人士解释一下吗?
答案 0 :(得分:3)
对于积分类型,与您的信念相反,不要求第一位代表符号。并且存在真实世界的陈述,其中绝对是不真实的。
关于积分类型可能具有不同幅度的最小值和最大值(即一个不是另一个的负值)的原因....当前编译器的典型实现选择是表示具有某些特定数量的整数类型位。可能的不同值(比特值的不同可能组合)的数量是2
,增加到比特数。因此,8
位signed char
可以表示256
(2
到8
)不同的值,16
位int可以表示{{1不同的值,65536
位int可以表示32
个不同的值。请注意,所有这些值都是均匀的。其中一个可表示的值将为零,这会留下奇数个其他不同的值。这意味着值必须加倍(两个不同的位模式表示相同的值)或[实际中通常的实现选择]最大值和最小值的大小不相等。顺便提一下,这也是14294967296
通常为无符号整数类型赋予奇数值的原因。
对于浮点,std::numeric_limits::max()
的规范是最小的正值(具有最小幅度的正值),min()
是最大的。如果希望负值从零开始最远,请使用(自C ++ 11开始)max()
。
答案 1 :(得分:2)
numeric_limits表现得像:
请参阅http://en.cppreference.com/w/cpp/types/numeric_limits/min:
返回数值类型T表示的最小有限值。 对于具有非规范化的浮点类型,min返回最小值 正标准化值。请注意,此行为可能是意外的, 特别是与整数类型的min行为相比。至 找到没有小于它的值的值,使用 numeric_limits ::最低。 min仅对有界类型有意义 对于无界无符号类型,即表示类型的类型 无限的负值集没有任何有意义的最小值。
cout << numeric_limits<double>::lowest() << endl;
将显示您的预期(1.79769e+308
)
答案 2 :(得分:1)
另一个在std中混淆命名的例子。 来自http://en.cppreference.com/w/cpp/types/numeric_limits/min:
对于具有非规范化的浮点类型,min返回最小正标准化值。