zoukankan      html  css  js  c++  java
  • C/C++中float和double的存储结构(转)

    在C/C++中float是32位的,double是64位的,两者在内存中的存储方式和能够表示的精度均不同,目前C/C++编译器标准都遵照IEEE制定的浮点数表示法来进行float,double运算。

    无论是float还是double,在内存中的存储主要分成三部分,分别是:

    (1)符号位(Sign):0代表正数,1代表负数

    (2)指数位(Exponent):用于存储科学计数法中的指数部分,并且采用移位存储方式

    (3)尾数位(Mantissa):用于存储尾数部分

    对于两者在内存中的存储结构,如下图所示:

        数字float 9.125在十进制中用科学计算的方式表示为9.125*10^0  ,但是在计算机中,计算机只认识0和1,所以在计算机中是按照科学计算的二进制的方式表示的:

    9的二进制表示为1001

    0.125的二进制表示为0.001

    所以9.125的表示成1001.001  将其表示成二进制的科学计数方式为 1.001001*2^3 

    在计算机中,任何一个数都可以表示成1.xxxxxx*2^n 这样的形式,

    其中xxxxx就表示尾数部分,n表示指数部分

    其中,因为最高位橙色的1这里,由于任何的一个数表示成这种形式时这里都是1,所以在存储时实际上并不保存这一位,这使得float的23bit的尾数可以表示24bit的精度,double中52bit的尾数可以表达53bit的精度。

        对于float型数据,可以精确到小数点后几位呢?当然,学过c的同学会说float能够精确到小数点后6位,但这是怎么的来的呢?下面做一点解释:

        十进制中的9,在二进制中的表示形式是1001,这里也就告诉我们,表示十进制中的一位数在二进制中需要4bit,所以我们现在float中具有24bit的精度,所以float在十进制中具有24/4=6,所以在十进制里,float能够精确到小数点后6位。同理,具有53bit精度的double类型能够精确到小数点后13位。

        对于float类型,他的指数部分有8bit,可以表示-127~128,但是这里采用了移位存储的方式(对这个概念不太清楚),在存储指数时数据的基数是127,而不是0,。例如上面的9.125,其二进制的指数部分为3,所以在存储时实际上存的是127+3=130。(130的二进制表示为10000010)

    最终根据上面图中float的存储结构可以知道,实际上9.125在计算机中:

    上面的二进制数转换成十六进制后表示形式为:01000001 00010000 00000000 00000000 --> 41 10 00 00

    实际上在X86计算机中,采用的是小端存储方式,即低地址存储低位数据,高地址存储高位数据。

    所以数据应该是这样存储的:

    对于double类型的存储方式实际上和float是类似的,只是存储的位数不同,在原理上都是一样的。

    转自:http://blog.csdn.net/qingtingchen1987/article/details/7719259

  • 相关阅读:
    jQuery 语法
    jQuery 简介
    把数据存储到 XML 文件
    XML 注意事项
    XML DOM (Document Object Model) 定义了访问和操作 XML 文档的标准方法。
    通过 PHP 生成 XML
    XML 命名空间(XML Namespaces)
    XML to HTML
    XMLHttpRequest 对象
    使用 XSLT 显示 XML
  • 原文地址:https://www.cnblogs.com/zl1991/p/7445579.html
Copyright © 2011-2022 走看看