您的位置:首页 > 编程语言 > C语言/C++

C++float数据在内存中的表示形式

2013-09-13 10:15 183 查看
简单地说,一个float型实数在内存中占4个字节,即32个二进制bit,从低位到高位依次叫第0位到第31位.这32

位可以分为3个部分:符号位(第31位),阶码(第30位到第23位共8位),尾数(最低23位)。 

1、符号位。最高位也就是第31位表示这个实数是正数还是负数,为0表示正数或0,为1表示负数. 

2、阶码。第30位到第23位这8个二进制位表示该实数转化为规格化的二进制实数后的指数与127(127即所谓偏

移量)之和即所谓阶码. 

规格化的二进制实数的指数只能在-127----+127之间,所以,一个float型数的最大值在+2^127即+3.4*10^38,

最小值在-2^127即-3.4*10^38. 

3、尾数。其他最低的23位即第22位到第0位表示该实数转化为规格化的二进制实数后小数点以后的其余各位

即所谓尾数. 

例如,将十进制178.125表示成机器内的32个字节的二进制形式. 

第一步:将178.125表示成二进制数:(178.125)(十进制数)=(10110010.001)(二进制形式); 

第二步:将二进制形式的浮点实数转化为规格化的形式:(小数点向左移动7个二进制位可以得到) 

10110010.001=1.0110010001*2^7 因而产生了以下三项: 

符号位:该数为正数,故第31位为0,占一个二进制位. 

阶码:指数为7,故其阶码为127+7=134=(10000110)(二进制),占从第30到第23共8个二进制位. 

尾数为小数点后的部分, 即0110010001.因为尾数共23个二进制位,在后面补13个0,即

01100100010000000000000 

所以,178.125在内存中的实际表示方式为: 

0 10000110 01100100010000000000000 

再如,将-0.15625表示成机器内的32个字节的形式. 

第一步:将-0.15625表示成二进制形式: (-0.15625)(十进制数)=(-0.00101)(二进制形式); 

第二步:将二进制形式的浮点数转化为规格化的形式:(小数点向右移动3个二进制位可以得到) 

-0.00101=-1.01*2^(-3) 同样,产生了三项: 

符号位:该数为负数,故第31位为1,占一个二进制位; 

阶码:指数为-3,故其阶码为127+(-3)=124=01111100,占从第30到第23共8个二进制位; 

尾数为小数点后的01,当然后面要补21个0; 

所以,-0.15625在内存中的实际表示形式为: 

1 01111100 01000000000000000000000 

可以通过以下的C程序验证之: 

#include <stdio.h> 

printfFloatBit(float f) /*功能:从高位到低位依次输出f的32个二进制位*/ 

{ int i,j; 

unsigned int byte=0; 

char ch,*p; 

p=(char *)(&f); /*将f的地址以char形式赋予p*/ 

printf("%20.7f: ",f); 

for(i=sizeof(float)-1;i>=0;i--) /*每循环一次将f从高到低产生一个字节*/ 



ch=*(p+i); 

byte=ch; 

  

for(j=1;j <=8;j++) /*每循环一次将一个字节从高到低产生一个二进制位*/ 

{ if(byte>=128) printf("1"); 

else printf("0"); 

byte < <=1; 

byte&=255; /*只保留最低8位,将左移后可能产生的进位舍去*/ 





  

printf("\n"); 

}  

main() 

{ float f1=178.125;  

float f2=-0.15625; 

clrscr(); 

printfFloatBit(f1); 

printfFloatBit(f2); 

system("pause"); 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: