这个例子就可以说明浮点数和整形类型的数据存储方式是不一样的 因此当你以不同的方式打印的时候,获取数据的方式也不一样。比如一个整形数据以浮点数的形式打印的话就会变成一个浮点数
浮点数也一样
所以我们要刨根看底 去探究一下浮点数在内存中究竟是如何存储的
首先浮点数v都可以表示成 (-1)^s*M*2^E 当v为正数时 s为0,当为负数时s为1
M是用科学计数法表示的 ,范围为1-2 E即为移动了几位,如果浮点向左移动几位 E为正数
如果浮点向右移动几位E为负数
首先来讲讲浮点数是如何存储的
如果为float类型 即32个bit位时,第一位为s 后面八位为 E 后面的23位为M
对于double类型的浮点数来说 有64个比特位 第一位为s 后面11位为E 后面的52位为M
遗憾的是。不是每个浮点数都可以被精准的存储到内存中的
因为浮点数也是用二进制存储的 。总会有一些小数没办法精准存储
反正M都是1. xxxxxx,干脆就不存小数点前面的位 ,只存小数点后面的位 这样就可以多存一位有效数字 ,可以存24个有效数字
首先E为无符号整数,但是我们知道科学计数法中的e是可以出现负数的 ,浮点向左移动E为正数,小数点向右移动E为负数 ,
所以我们在存储时需要用到一些中间值 当为32bit位时,中间值为127 当为64bit位时中间值为1023
float类型的中间值是127,double类型的的中间值是1023,都是为了方便存储E比如你如果想表示E为-1,当你以foloat类型存储时,实际上它存储的值是126
当你想以double类型存储E时实际上存储的是1022这个值 这是放到内存的方式
就是这样存的 比如小数点后面的 011 就直接存进去 后面的全部补0
不能前面补0,只能在后面补0数值才不会变
-----------------------------如何把浮点数从内存取出来
这个就比较的麻烦了
首先看E的那八位bit或者11位bit位 是否为全1或者全0
如果不是全1或全0 存储数-中间值 的到真实值 再将有效数字M前面加上第一位的1
全为0的话 那么此时 E直接为-126或者-1022 即为真实值 且 M无需加上那个1
全为一表示正负无穷大 ,正负看第一个符号位s
原来是这样子 ,浮点数跟整形虽然都是使用的二进制,但是他俩读取的方式不一样 ,也就是存储的方式不一样
但是只要是超过一个字节的存储,也都有大小端的问题