idi*_*ish 28 c# c++ java floating-point int
您可能知道,这两种类型都是32位.int
只能包含整数,float
而且还支持浮点数(如类型名称所示).
那么最大值int
是2 31,最大值 float
是3.4*10 38,而它们都是32位,怎么可能呢?
我认为int
最大值容量应该高于浮点数,因为它不会为浮点数保存内存,只接受整数.在那种情况下,我会很高兴得到解释.
Aak*_*shM 47
你的直觉非常正确地告诉你,在一个中没有更多的信息内容,因为它们都有32位.但这并不意味着我们不能使用这些位来表示不同的值.
假设我发明了两种新的数据类型,uint4
并且foo4
.uint4
在标准二进制表示中使用4位来表示整数,所以我们有
bits value
0000 0
0001 1
0010 2
...
1111 15
Run Code Online (Sandbox Code Playgroud)
但foo4
使用4位来表示这些值:
bits value
0000 0
0001 42
0010 -97
0011 1
...
1110 pi
1111 e
Run Code Online (Sandbox Code Playgroud)
尽管具有相同的位数,但现在foo4
具有更广泛的值uint4
!怎么样?因为有些uint4
值无法表示foo4
,所以位映射中的"槽"可用于其他值.
这是相同的int
和float
-它们可以从一组2倍的两个存储值32的值,只是不同组2个的32值.
Rot*_*tem 12
float可能存储更高的数值,但即使在小数点之前的数字上也不会精确.请考虑以下示例:
float a = 123456789012345678901234567890f; //30 digits
Console.WriteLine(a); // 1.234568E+29
Run Code Online (Sandbox Code Playgroud)
请注意,几乎没有任何精度.
另一方面,整数将始终精确地存储其值范围内的任何数字.
为了便于比较,让我们看一下双精度浮点数:
double a = 123456789012345678901234567890d; //30 digits
Console.WriteLine(a); // 1.23456789012346E+29
Run Code Online (Sandbox Code Playgroud)
请注意,保留的有效数字大约是其两倍.