物理存储
物理存储就是我们常说的0101····结构,整形是二进制的数存在内存里。
例如(short型):
4 就是0000000000000100
16就是0000000000010000
那么问题来了,float有小数点后面的内容,这些内容如何用0101去存储呢,中间的小数点呢?计算机怎么识别这是个浮点数呢?
解答
首先要理解数据存储究竟是怎么回事,以int和short为例。
对于short而言,一共16 位,高位为符号位。
对于 int 而言,一共32 位,高位为符号位。
也就是说对于1而言:
short: 0000000000000001
int : 00000000000000000000000000000001
符号位均为0表示正数。
对于负数而言,就是符号位为1,其它位为该值的补码(取反加一就是补码)。
也就是说对于-1而言:
short: 1111111111111111
int : 11111111111111111111111111111111
所以short的范围为-32768~32767;
最小为:1000000000000000
最大为:0111111111111111
int的范围为-2147483648~2147483647
最小为:10000000000000000000000000000000
最大为:01111111111111111111111111111111
知道有符号数了,无符号数就更加简单了,第一位也算有效位,没有补码运算(因为没有负数)。例如:
unsigned short
最大为1111111111111111最小为0000000000000000
无符号short范围:0~65535
unsigned int
最大为11111111111111111111111111111111
最小为00000000000000000000000000000000
无符号int范围为:0~4294967295
那么看看float和double有什么区别呢
float所占内存为32位,double所占内存为64位。和整形不同,不仅有符号位和有效位,还有阶码和尾码区分。
类型 | 符号位 | 阶码 | 尾码 |
---|---|---|---|
float | 1 | 8 | 23 |
double | 1 | 11 | 52 |
下面举例一个浮点数如何存储转换的(以float为例)
以浮点数18.75为例
- 首先转化为二进制即10010.11
- 转化为科学计数法即1.001011*2的e次方(e=4)
- 这个指数的值就是阶码的值,正数所以符号位为0,小数点后的为尾码,超出去部分舍掉并取整。
- 所以最终存储为0 10000011 0010110 00000000 00000000
- 同理可得-18.75的存储为1 10000011 0010110 00000000 00000000
对于double也是同样的道理。
总结
float和double组成形式完全相同,只不过位数不同,表示的范围不同,精度自然也不同。