北京做网站比较好的公司,学校网站开发说明书文档,跨境电商自建站是什么意思,html标签大全IEEE754标准中#xff0c;浮点数的内存布局 以下仅以float#xff08;内存中占据4个字节#xff0c;32bits#xff09;来说明#xff0c;double#xff08;8个字节#xff0c;64bits#xff09;同理#xff0c;只是有细微的差别。 float的内存分布 IEEE754规定#x…IEEE754标准中浮点数的内存布局 以下仅以float内存中占据4个字节32bits来说明double8个字节64bits同理只是有细微的差别。 float的内存分布 IEEE754规定32bit的float在内存中是这样分布的 符号位(S)阶码(E)尾数(M)1823整数、浮点数在内存中都是以二进制的形式存在的补码而浮点数是二进制下的科学计数法存储在内存中的。可以表示 为$ s 1.m^e$ 符号位占据一个比特当S 0时表示正数当S 1时表示负数。 阶码e则是其指数再加上一个偏移量127后的数其总共占据了8个字节8位无符号数的范围是0~255考虑到已经加了一个偏移量则其实际可表达的范围是-128~127这个范围是指二进制计数法下的范围。尾数m占据了23个字节由于是使用的二进制下的科学计数法所以任何浮点数除了0都隐含了一个1也就是说其尾数实际上在前面应该再加一个1即1.m这样浮点数的二进制精度是24位而$2^{24} 16777216$所以其十进制下的精度是7位有效数字。 计算实例 1 十进制与二进制的互转 二进制转十进制比较简单就是对应位乘以对应的2的幂次比如101.1011其转换过程为 $$1*2^2 0 * 2^1 1 * 2^0 1 * 2^{-1} 0 * 2^{-2} 1 * 2^{-3} 1 * 2^{-4}$$ 十进制整数转二进制比较简单一是8421来凑一是除2倒序排不再解释。 十进制小数转二进制就是一直乘2如果大于1则置1如果小于1则置0一直乘2直到为0或达到指定位数为止。 比如0.125 $$ 0.25 * 2 0.5 --- 0 \\ 0.5 * 2 1 --- 1$$ 则其二进制为0.01。 再比如0.632 $$ 0.632 * 2 1.264 --- 1 \\ 0.264 * 2 0.528 ---0 \\ 0.528 * 2 1.056 ---1 \\ 0.056 * 2 0.112 ---0 \\ ...$$ 则其二进制为0.1010….。 2 计算float的内存布局 2.1 考虑float fa 4.25那么int ia *(int*)fa是多少呢 我们知道4.25 100.01化成指数表示为$1.0001*2^2$则其符号位S 0 阶码e 2 127 0x81其尾数部分二进制表示为1000 1000 0000 0000 0000 0000总共24位将尾数的最高位的1去掉再与阶码e符号位S组合后 符号位(S)阶码(E)尾数(M)01000 0001000 1000 0000 0000 0000 0000合起来就是 0100 0000 1000 1000 0000 0000 0000 0000即ia 0x40880000。 2.2 再考虑float fa -0.0125那到c int ia *(int*)fa是多少呢 -0.0125 -0.00000011001100110011001100...转换成指数为$-1.10011001100110011001100…*2^{-7}$则其符号位S 1阶码e -7 127 0x78其尾数部分用二进制表示为1100 1100 1100 1100 1100 1101后面的位数就被四舍五入截断了由于最后一位的后一位是1则向前进1同样保留24位将其最高位的1去掉再与阶码和符号位组合 符号位(S)阶码(E)尾数(M)10111 1000100 1100 1100 1100 1100 1101全起来就是 1011 1100 0100 1100 1100 1100 1100 1101即ia 0xbc4ccccd。 如果将ia转换成fa则转换过程相反。来自为知笔记(Wiz)转载于:https://www.cnblogs.com/beichen2012/p/5756321.html