现在的位置: 首页 > 综合 > 正文

简要记录浮点型数据的二进制存储格式

2013年11月03日 ⁄ 综合 ⁄ 共 1134字 ⁄ 字号 评论关闭

      浮点数包括floatdouble两种类型,float32位,double64位。其二进制存储格式遵循IEEE754标准。以float为例:

     

      符号位:正数为0,负数为1

      float型数据123.456为例,分析其二进制存储格式:

      首先将十进制数123.456转换为二进制数为:1111011. 01110100101111001 

      (其中0.456如何转换为二进制?不断乘以2…

      1111011. 01110100101111001 1. 11101101110100101111001乘以26次方

      首先这是一个正数,则符号位为0

      阶码为6,不过要转换成移码。

      (如何求6的移码?这里我也不太深究,我见大家都是直接6+127=133,换为2进制为10000101

      尾数则为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类型的二进制存储格式是同样的道理。

 

抱歉!评论已关闭.