C语言中得到一个float值在内存中的16进制表示

来源:互联网 发布:服务器租用网站源码 编辑:程序博客网 时间:2024/05/17 05:50








float占据4个字节32位,1位为符号位,8位指数位,23位尾数位。



将72.65f转为为16进制表示
第一步:将浮点数转换为二进制显示
将72.65f转换为二进制显示形式为 100 1000. 101 0011 0011 0011...
整数部分转换方法为 72不断地除以2取余,然后从后往前排列
72/2 = 36 余0
36/2 = 18 余0
18/2 = 9  余0
9 /2 = 4  余1
4 /2 = 2  余0
2 /2 = 1  余0
1 /2 = 0  余1
所以整数部分为 100 1000
小树部分转换方法为,0.65不断地乘以2 取整数部分,然后从前往后排列
0.65 * 2 = 1.3 取1
0.3  * 2 = 0.6 取0
0.6  * 2 = 1.2 取1
0.2  * 2 = 0.4 取0
0.4  * 2 = 0.8 取0
0.8  * 2 = 1.6 取1
0.6  * 2 = 1.2 取1
.
.
.
所以小数部分为101 0011 0011 0011 ...合并起来就是100 1000. 101 0011 0011 0011 ...


第二步:将小数点向左移动,直至到第一个1的右边,记下移动的步数
100 1000. 101 0011 0011 0011... 将小数点向左移动6步,然后数字为1.0010 0010 1001 1001 1001 1001 ...
小数点后面的即为最终结果的小数部分,取23位有效数字,将23位以后的舍弃,第24为1,向前进一位(如果为0,
直接舍弃),为1.0010 0010 1001 1001 1001 101,将小数点左边的1丢掉为.0010 0010 1001 1001 1001 101
我们移动了6步,对6进行偏移127为133 ,二进制为 1000 0101,将这个值作为最终结果的指数部分


第三步:将整数部分小数部分对接
1000 0101 . 0010 0010 1001 1001 1001 101
现在一共是8 + 23 = 31 位,此时再在前面加上一位符号位0(正数为0,负数为1)
结果是0 1000 0101 0010 0010 1001 1001 1001 101
写的更直观一点 0100 0010 1001 0001 0100 1100 1100 1101


第四步:将二进制转换为十六进制
即为42914ccd
所以72.65f的十六进制为 42914ccd,如果我们在VS中将一个float变量赋值为72.65f的话,打开内存窗口,
选择4字节整数显示,找到该变量的起始地址,可以看见里面填充的值就是 42914ccd







0 0