您可能知道,这两种类型都是 32 位的。int
只能保存整数,同时float
也支持浮点数(如类型名称所示)。
那么怎么可能最大值int
是 2 31,最大值 float
是 3.4*10 38,而它们都是 32 位呢?
我认为它int
的最大值容量应该高于浮点数,因为它不会为浮点数节省内存并且只接受整数。在这种情况下,我会很高兴得到解释。
您可能知道,这两种类型都是 32 位的。int
只能保存整数,同时float
也支持浮点数(如类型名称所示)。
那么怎么可能最大值int
是 2 31,最大值 float
是 3.4*10 38,而它们都是 32 位呢?
我认为它int
的最大值容量应该高于浮点数,因为它不会为浮点数节省内存并且只接受整数。在这种情况下,我会很高兴得到解释。
您的直觉非常正确地告诉您,一个中的信息内容不能多于另一个,因为它们都有 32 位。但这并不意味着我们不能使用这些位来表示不同的值。
假设我发明了两种新的数据类型,uint4
并且foo4
. uint4
使用 4 位来表示一个整数,在标准的二进制表示中,所以我们有
bits value
0000 0
0001 1
0010 2
...
1111 15
但foo4
使用 4 位来表示这些值:
bits value
0000 0
0001 42
0010 -97
0011 1
...
1110 pi
1111 e
尽管位数相同,但现在foo4
具有比更广泛的值范围!uint4
如何?因为有些uint4
值不能用 来表示foo4
,所以位映射中的那些“槽”可用于其他值。
和int
-float
它们都可以存储一组 2 32 个值中的值,只是存储不同的 2 32 个值组。
浮点数可能存储更高的数值,但即使在小数点之前的数字上也不会精确。考虑以下示例:
float a = 123456789012345678901234567890f; //30 digits
Console.WriteLine(a); // 1.234568E+29
请注意,几乎没有保持任何精度。
另一方面,整数将始终精确地存储其值范围内的任何数字。
为了便于比较,我们来看一个双精度浮点数:
double a = 123456789012345678901234567890d; //30 digits
Console.WriteLine(a); // 1.23456789012346E+29
请注意,保留了大约两倍的有效数字。
这些基于 IEEE754 浮点规范,这就是它可能的原因。请阅读本文档。这不仅仅是关于多少位。
提示在“浮点”的“浮动”部分。你所说的基本上是假设固定点。浮点数不会为小数点后的数字“保留空间” - 它的位数有限(23 位二进制)并记住将其乘以的 2 的幂。