为什么float和int具有不同的最大值,即使它们的位数相同?
可能重复:
当java中的大小相同时,float和integer数据类型之间有什么区别?
您可能知道,这两种类型都是32位。 int
只能保存整数,而float
也支持浮点数 (如类型名称所示)。
那么int
的最大值怎么可能是2 31 ,而float
的最大值是3.4 * 10 38 ,而它们都是32位?
我认为int
的最大值容量应该高于float,因为它不会为浮点数保存内存并且只接受整数。 在那种情况下,我会很高兴得到解释。
你的直觉非常正确地告诉你,一个信息内容不会比另一个信息内容更多,因为它们都有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
表示,所以位映射中的’slot’可用于其他值。
对于int
和float
也是一样的 – 它们都可以存储来自一组2 32个值的值,只是存储2 32个值的不同组。
float可能存储更高的数值,但即使在小数点之前的数字上也不会精确。 请考虑以下示例:
float a = 123456789012345678901234567890f; //30 digits Console.WriteLine(a); // 1.234568E+29
请注意,几乎没有任何精度。
另一方面,整数将始终精确地存储其值范围内的任何数字。
为了便于比较,让我们看一下双精度浮点数:
double a = 123456789012345678901234567890d; //30 digits Console.WriteLine(a); // 1.23456789012346E+29
请注意,保留的有效数字大约是其两倍。
提示位于“浮点”的“浮动”部分。 你说的基本上是假定的。 浮点数不会为小数点后的数字“保留空间” – 它具有有限的位数(23二进制)并记住2乘以2的幂。
这些基于IEEE754浮点规范,这就是为什么它是可能的。 请阅读本文档 。 它不只是关于多少位。