在C++中,小数用浮点类型来表示。浮点类型主要有3种,float、double、long double,它们主要的差别是数据的表示范围不同。C++标准指定了一个浮点数有效位数的最小值,然而大多数编译器都实现了更高的精度。通常,float用32位来表示,double用64位来表示,long double的长度根据编译器的不同而不同,通常是8字节,12字节,16字节。
在计算机中,虽然它们的长度不同,但是它们的存储原理相同,只是指数部分和尾数部分的长度不同。
下面,我们以float为例,来讲解一下IEEE的存储原理。
图1 float的IEEE存储格式
如图1所示,float在内存中占用4个字节,其中符号占用1位,正号用0表示,负号用1表示。指数部分用8位来表示,尾数部分用23位来表示。为了方便大家理解,下面,我们一起来转换一个小数为IEEE的存储格式。
例1 将float类型的8.25转换为IEEE存储格式
解:
1、转换8.25为二进制:1000.01。
2、移动小数点,使小数点前的整数部分为1,1000.01表示为1.00001 * 2^3。
3、根据第2步的结果填充内存:
a )因为是正数,所以符号位为0。
b )将指数部分加127,所以指数部分为3+127=130,转换为二进制为10000010。
c )去掉最左边的1,将剩余的00001扩展至23位,即00001000000000000000000。
4、最终结果为:0 10000010 00001000000000000000000,转换为16进制为:0x41 0x04 0x00 0x00,按照小端存放:0x00 0x00 0x04 0x41。
测试代码如下:
#include <stdlib.h> #include <stdio.h> void main() { float f = 8.25; system("pause"); return; }测试结果如图2所示:
图2 测试结果图
如图2所示,我们的推断结果与事实相符。
今天,我们主要讲了浮点类型的种类,以及float的IEEE存储方式。double与float类似,只是指数部分不是8位,而是11位,尾数是52位,总位数64位。希望大家回去多实践,加深对float存储格式的理解。