IEEE754规定,对于32位浮点数(float),最高的一位是符号位s,接下来8位是指数位E,剩下的23位为有效数字位M;
对于64位浮点数(double),最高的一位是符号位s,接下来11位是指数位E,剩下的52位为有效数字位M。
12.5转换成二进制是1100.1,规范化指数形式为1.1001*2^3;规范化指数形式就是指小数点前面应该有一位且只能有一位非0的数字(即1)。其中规范化形式中指数都是2,小数点前面都是1,所以这两个相同的数字就不需要占用内存了,这样也可以提高数值的精度。
首先对于符号位,正数为0,负数为1;因为这个数是正数,所以第一位就是存放0;其次是指数位,指数位占用了8个字节,最多可以存放256个数字,在一个有符号的整数中,我们都是以第一位来存放符号位的,那指数的符号位怎么存放呢?因为分了正负,所以一个字节的数字存储范围一般是-128到127,我们怎么将这些数字按无符号存储呢?结合这两点,我们引入了映射的观点,假设x是字面的指数,y是真实的指数,X的范围是0~255,y
具体是怎么存放的呢?下面就以一个float型的数据12.5为例来看存储方式。
的范围是-128~127,所以另y=x-127;即真正的指数是3,但是我们要保存的字面指数为3+127即130
的二进制,即1000 0010;指数位就解决了,下面就是有效数字,其实就是小数点后的数字,为1001,只占了四位,所以剩下的19位全补0。最后存储的形式就是 0 1000 0010 10010000000000000000000;但是其实在内存中数据是以十六进制存放的,即0X 41480000,如果是小端的方式就是 0X 00 00 48 41。