转自:http://blog.csdn.net/joyzml/archive/2011/02/25/6206913.aspx
http://bbs.pediy.com/showthread.php?t=55241
浮点数包括float和double两种类型,float占32位,double占64位。其二进制存储格式遵循IEEE754标准。以float为例:
符号位:正数为0,负数为1
以float型数据123.456为例,分析其二进制存储格式:
首先将十进制数123.456转换为二进制数为:1111011. 01110100101111001
(其中0.456如何转换为二进制?不断乘以2…)
1111011. 01110100101111001即1. 11101101110100101111001乘以2的6次方
首先这是一个正数,则符号位为0
阶码为6,不过要转换成移码。
(如何求6的移码?这里我也不太深究,我见大家都是直接6+127=133,换为2进制为10000101)
(移码与补码的关系: [X]移与[X]补的关系是符号位互为相反数(仅符号位不同))
尾数则为1. 11101101110100101111001的小数部分,即
11101101110100101111001
综上:123.456的二进制存储格式为:01000010111101101110100101111001
用一段代码来验证一下:
#include <cstdlib>
#include <iostream>
using namespace std;
void printBinary(const unsigned char val)
{
for(int i = 7; i >= 0; i--)
if(val & (1 << i))
std::cout << "1";
else
std::cout << "0";
}
int main()
{
float d = 123.456;
unsigned char* cp = reinterpret_cast<unsigned char*>(&d);
for(int i = sizeof(float)-1; i >= 0 ; --i)
{
printBinary(cp[i]);
}
system("PAUSE");
}
要注意的是,X86架构为小端模式,是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中。所以上面的for(int i = sizeof(float)-1; i >= 0 ; --i)先打印高地址部分,即二进制的高字节数据。
程序的执行结果:
01000010111101101110100101111001
对比一下刚才的分析结果是相同的。
double类型和float类型的二进制存储格式是同样的道理。
我们知道任何一个数都可以按科学计数法表示成A×10的B次方的形式,其中1.0≤A<10,B为整数。同样的道理,也可以表示成C×010的D次方的形式,其中010表示2的二进制表示,C为二进制浮点数,D为二进制整数。例如5.0用二进制表示就是0101,也就是可以表示成(1.01)×010的2次方的形式。知道了这点,我们来看一下在VC里面是怎样来存储double型数据的。
在VC里面,double型数据占据了8个字节,共64位。
最高位是符号位,0表示正,1表示负。
接下来的11位表示指数,用移码表示,关系为:11位数组成的值(无符号)-1023=指数,如上所示5.0的指数部分是2,11位数组成的值应该是1025,即10000000001
余下的52位是小数位,其中1.0……中的1是默认的,没有占据位数。5.0的小数部位是1.01,则它的小数位在内存中应该表示成010000000000……0000(共52位)
所以+5.0在内存中存储的形式应该是01000000000101000000……0000即0x4014000000000000。
下面我们通过一个程序来验证一下:
#include"stdafx.h"
#include"iostream.h"
typedefuniontagOct
{
doubledData;
intnData[2];
}Oct;
intmain(intargc,char*argv[])
{
Octa;
a.nData[0]=0;
a.nData[1]=0x40140000;
cout<<a.dData<<endl;
return0;
}
相信这段代码很好理解,先通过整形数组给共用体赋值,再以浮点的形式输出,最后的结果果然是5。如果把0x40140000改成0xC0140000呢,相信你很快就得到答案,是-5,不相信?去试试吧。
附:float型和double型基本一样,只是它用8位表示指数,用23位表示小数,另外它的移码表示不是相差1023(2的10次方-1),而是127(2的7次方-1)。有兴趣可以试验一下。
分享到:
相关推荐
简要介绍了二进制同步通信规程,数据链路控制规程,数据链路层的概念以及分类,功能等,重点介绍了二进制同步通信规程,即BSC的相关概念
简要介绍了嵌入式系统以及相应的开发工具,然后对命令行的结构、功能、特点进行了分析,具体研究了如何用 语言和二进制树 C 实现命令行。最后给出了命令行发展的一个可行的方向。
本篇文章主要介绍了JAVA中读取文件(二进制,字符)内容的方法总结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
以下是一些关键概念的简要介绍: 1. 安全性(Safety):Rust的首要目标是提供安全性。Rust具有内存安全性和线程安全性的保证,通过在编译时执行许多严格的借用检查,确保程序不会出现常见的内存错误,如空指针引用...
最常用的二进制搜索变体由Hermann Bottenbruch于1962年首次发布,此后一直没有发生明显变化。下面,我将介绍几种具有改进性能的新颖变体。最显着的变体是单界二进制搜索,它对小于100万个32位整数的数组执行比标准二...
实验名称: 学号 姓名: 班级: 实验时间: 实验报告表2-1 数值型数据在计算机中的二进制实验记录表 十进制整数分类 输入十进制整数 内存整型数据 内存地址号 任意正整数 7 0000011100000000 0001000100010002 任意...
作者:(位于googlemail.com上的urbste)此存储库包含一种使用已校准的摄像头使二进制描述符失真的方法。 此外,可以在线学习口罩。 消息 28/10/2016第一次提交 该存储库包含以下方法: dBrief和mdBrief二进制描述符...
该脚本的初始版本仅产生了PHYLIP矩阵,但现在我们添加了其他流行的格式,包括使用BEAST中的SNAPP插件运行SNP分析的二进制NEXUS文件(仅适用于二倍体基因型)。 此外,您可以为每个SNP选择最少数量的样本,以控制...
将十六进制0~f转换成ASCLL码 将0~f ASCLL码 存入数据段 根据需要查询的数字调用输出
Ppt ,简要介绍了webgis的空间数据存储方式。
二进制开发简介和二元开发的介绍。 这一系列挑战可以用来将新手介绍给剥削艺术。 所有挑战均由我们开发,并获得了许可,但面临的某些挑战以及作者的财产除外。下载递归克隆此存储库: git clone --recursive ...
IGES文件格式简要说明(简单整理出核心代码) IGES文件由五或六段组成: 标志(FLAG)段; 开始(START)段; 全局(GLOBAL)段;...其中,标志段仅出现在二进制或压缩的ASCII文件格式中。
主要内容包括数据仓库的设计与建造步骤,传统系统到数据仓库的迁移,数据仓库的数据粒度、数据分割、元数据管理、外部数据与非结构化数据,分布式数据仓库、高级管理人员信息系统和数据仓库的设计评审等。...
用于高效二进制级别覆盖率分析的工具。 bcov在没有编译器支持的情况下静态地检测x86-64 ELF二进制文件。它具有探针修剪,精确的CFG分析和复杂的仪器技术的功能。我们总结了本研究在2分钟预告片。 资源 有关详细信息...
简述了当前大型数据中心普遍采用的计算节点集群与存储系统模块化设计的系统结构,说明了部署在各模块上的主要集群系统。分析了具有独立性的结构化数据本地化存储于计算节点的可能性,给出了系统基本框架,从总体拥有...
在分析了数据交换和共享的国内外研究现状,并比较了目前几种数据交换模式和共享方法的优缺点的基础上,简要分析和探讨了将AutoCAD的DWG格式数据完整转换为MAPGIS的数据格式的步骤和方法,实现其相互转换,完成2种格式...
CFTC持仓数据的简要分析.pdfCFTC持仓数据的简要分析.pdfCFTC持仓数据的简要分析.pdfCFTC持仓数据的简要分析.pdfCFTC持仓数据的简要分析.pdfCFTC持仓数据的简要分析.pdf
8.3 存储外部数据/非结构化数据 159 8.4 外部数据/非结构化数据的不同 组成部分 160 8.5 建模与外部数据/非结构化数据 160 8.6 间接报告 161 8.7 外部数据归档 161 8.8 内部数据与外部数据的比较 161 8.9 小结 162 ...
8.3 存储外部数据/非结构化数据 159 8.4 外部数据/非结构化数据的不同 组成部分 160 8.5 建模与外部数据/非结构化数据 160 8.6 间接报告 161 8.7 外部数据归档 161 8.8 内部数据与外部数据的比较 161 8.9 小结 162 ...
一种机器有效的格式,用于线性表示小数据结构,以进行(取消)序列化,消息传递和共享内存分配。 正元组是根据极少的命题设计的。 机器方便的格式,用于线性表示小数据结构,以进行(序列化)序列化,消息传递和在...