单精度浮点数占据4个字节,4个字节的分配如下:
(a)第一位为符号位,0表示正,1表示负;
(b)第2~9位为阶码,采用移码表示;
(c)第10~32位为尾数,采用原码表示。
(1)给定32位串,如何转换成十进制数
假设内存中存在32位串:CD CC 08 41。因为INTEL CPU采用little endian存储方式,所以其真实的值为:41 08 CC CD。将其写成二进制形式:
0 10000010 00010001100110011001101
该浮点数为正数,阶码为10000010,尾数部分为00010001100110011001101。因为在IEEE754中,单精度浮点数有规格化处理,所以其真正尾数部分为1.00010001100110011001101,其中‘.’为小数点。
移码的10000010表示3(127+3),所以尾数部分的小数点必须向右移动3位才能得到真实的数据。真实数据为:
1000.10001100110011001101,其十进制值为:
8+0.5+1/32+1/64+1/256+1/512+1/4096+1/2^13+1/2^16+1/2^17+1/2^20+1/2^21+1/2^23 ~= 8.55
(2)如何将十进制数转换成二进制的单精度浮点数
给定数123.5,其对应的二进制原码为:1111011.1,左移六位得:(1.1110111)*2^6。根据规格化处理,所有尾数部分都转化为1.M形式,其中整数部分1可以省略,所以尾数部分为:1110111。因为左移六位,其阶码值为6,阶码的移码表示为(127+6)=133=10000101。有了尾数部分和阶码部分,我们就可以得到123.5的单精度浮点数位串:
0 10000101 11101110000000000000000
其十六进制表示为:42 F7 00 00,按照little endian存储方式,其内存值为:00 00 F7 42
欲详细了解原码、反码、补码的细节,请参阅牛人的文章:http://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html