float和double的存储格式

物理存储

物理存储就是我们常说的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为例

  1. 首先转化为二进制即10010.11
  2. 转化为科学计数法即1.001011*2的e次方(e=4)
  3. 这个指数的值就是阶码的值,正数所以符号位为0,小数点后的为尾码,超出去部分舍掉并取整。
  4. 所以最终存储为0 10000011 0010110 00000000 00000000
  5. 同理可得-18.75的存储为1 10000011 0010110 00000000 00000000

在这里插入图片描述
对于double也是同样的道理。

总结

float和double组成形式完全相同,只不过位数不同,表示的范围不同,精度自然也不同。

扫描二维码关注公众号,回复: 15849244 查看本文章

猜你喜欢

转载自blog.csdn.net/qq_36206070/article/details/89683848