1、将13.75转成二进制数
整数部分:
13/2 = 6...........1(余数)
6/2 =3............0 从下往上读为1101,即为13的二进制
3/2 =1............1
1/2 =0............1(商为0止)
取每次结果的商除以2
小数部分:
0.75 * 2 = 1.5...........1(取整数部分) 从上往下为11即为0.75的小数部分的二进制
0.5*2 =1.0............1(小数为0止)
取每次结果的小数部分乘2
13.75的二进制为1101.11
2、将二进制左移到仅有1位有效位为1.101 11,左移了3位(原则:小数点左边仅有1位有效位,需要左移或右移)
3、指数部分为127+3 = 0x82 即浮点格式中指数的二进制为1000 0010(如果是右移则减3)
4、13.75是正数,符号位为0
5、浮点格式的小数部分为101 11
将上述结果填入浮点数的各个域中,如下:
0 1000 0010 10111 00000000 000000000(右边小数位补0,凑32位)
转成十六进制:
0100 0001 0101 1100 0000 0000 0000 0000(即0x415C0000)
怎们验证呢?打开C++builderIDE环境,输入代码:
float i = 13.75;
在此行并下断点,然后查看CPU反汇编代码,如下图:
如果是一个纯小数呢?原则和上面一样。如0.25 ,整数部分为0,小数部分转成二进制为:
0.25 *2 = 0.5......0
0.5*2 = 1.0......1
从上到下读值为01,即0.35的二进制表示为0.01,需要右移2位,即乘以2的-2次方,浮点数的指数部分为127-2=125=0x7D
填充到浮点格式域中:0 01111101 00000000000000000000000 即0x3e800000为内存中的值