IEEE 二进制浮点数的表示
朋友在谈一个物流相关的项目,是以前项目的一个延续,涉及到后台的扩展,手机端的App,外加两个App的对接的蓝牙打印机。这个项目前后说了一个多月了吧,最近才草拟了协议。项目本来不复杂,但是客户却如此的拖延。我觉得客户做事好慢,而朋友觉得是自己的就是自己的,不是自己的急也没有用。不断的打电话询问客户,可能最后还被压价,反而更没办法做了。他其实比我还急,但是人家的心态好。的确凡事急不得。
浮点数
在 C 语言中,有两种存储浮点数的方式,分别是 float 和 double ,当然了还有long double。这几种浮点型所容纳的长度不同,当然它们存储的精度也就不同了。
对于整形而言,比如 int 、short 、char 之类的,在内存中的存储方式都是用 补码 进行表示。而浮点数在内存中并没有使用补码进行表示。浮点数在内存中存储的方式使用了 IEEE 的编码表示方式,即使用 符号、指数 和 尾数 的形式进行存储的。
IEEE浮点数表示
用 IEEE 编码表示浮点数,需要 3 部分进行表示,分别是 符号、指数 和 尾数。符号位占用 1 位,0 表示正数,1 表示负数。指数 和 尾数 根据 float 和 double 类型的不同而长度不同。
IEEE 二进制浮点数的表示:
位数 符号位 指数位 尾数位
32 1 8 23 单精度(float)
64 1 11 52 双精度(double)
编码转换
以单精度为例:把3.75用IEEE表示法表示
1、把 10 进制转换为2进制:3.75D=11.11B
2、 尾数正规化 1.111*2^1
3、 修正指数 1+127=128 1000 0000
4、 符号 0表示正,1表示负
5、 IEEE表示 0 1000 0000 1110 0000 0000 0000 0000 000
6、 转换为16进制: 0100 0000 0111 0000 0000 0000 0000 0000 40 70 00 00
用 C 程序进行验证
写一个简单的 C 程序来验证上面的转换,代码如下:
1 #include <stdio.h> 2 3 int main() 4 { 5 float f = 3.75f; 6 7 printf("%f \r\n", f); 8 9 return 0; 10 }
以上代码用 VS 2012 编译,调试运行查看内存,如下图所示。
图中的00 00 70 40是以小尾方式存储的,其值为40 70 00 00,与我们手动转换的值相同。
上一篇: Shuffling Machine
下一篇: PS制作海绵宝宝眨眼的动态图
推荐阅读
-
剑指offer11:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。(进制转换,补码反码)
-
C#实现将浮点数表示的货币数量以汉字大写形式输出的方法
-
IEEE 二进制浮点数的表示
-
用一张表来存储数据状态,并且可以进行多状态精确查询;使用二进制来表示数据状态,并且是可以无顺序的状态;解决使用中间表来存储数据的多状态;数据状态还可以这么玩;
-
C++中二进制 八进制 十进制 十六进制的表示方法
-
负数在计算机中的二进制表示(原码、反码与补码)
-
【C语言】输入一个整数,输出该数二进制表示中1的个数(三种方法)
-
读入一个10进制正整数,将其进行二进制表示,取其从右端开始的第4至7位,输出这一部分的10进制表示。
-
c++使用bitset输出一个整数的二进制表示
-
金山笔试题 "写一个函数,对给定整数的二进制表示进行描述"