浮点数是我们在程序里常用的数据类型,它在内存中到底是怎么样的形式存在。
现代计算机中,一般都以IEEE 754标准存储浮点数,这个标准的在内存中存储的形式为:
对于不同长度的浮点数,阶码与小数位分配的数量不一样,如下:
对于32位的单精度浮点数,数符分配是1位,阶码分配了8位,尾数分配了是23位。
根据这个标准,我们来尝试把一个十进制的浮点数转换为IEEE754标准表示。
例如:178.125
首先是乘2取整法,即每一步将十进制小数部分乘以2,所得积的小数点左边的数字(0或1)作为二进制表示法中的数字,直到满足你的精确度为止。
转换过程:
0.874的转换过程(取精度为6位):
0.874*2=1.748 小数点左边为 1
0.748*2=1.496 小数点左边为 1
0.496*2=0.992 小数点左边为 0
0.992*2=1.984 小数点左边为 1
0.984*2=1.968 小数点左边为 1
0.968*2=1.936 小数点左边为 1
十进制:123.874
二进制:1111011.110111
一.先把浮点数分别把整数部分和小数部分转换成2进制
二. 把浮点数转换二进制后,这里基本已经可以得出对应3部分的值了
例题:为什么以下代码运行结果为0:
# include <stdio.h> #include <windows.h> int main(int argc, char *argv[]) { int i =15; float m= (float)i; printf("%d\n",m); system("pause"); return 0; }
浮点数作为变参函数的参数时需要转换为双精度浮点值
float作为变参函数的参数需要转换为双精度浮点值(重要的话重复3遍)。
知道了这些,就不难理解本文开头的程序输出为0了, float (15) 转成双精度浮点数后,高位4字节为0,且此高4位和%d对应,故输出为0
info 评论功能已经关闭了呐!