float与double内存中的表示

本文详细解析了float和double类型在计算机内存中的存储原理,包括符号位、阶码及尾数的具体构成方式,并通过实例说明如何将十进制浮点数转化为内存中的二进制表示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

// float与double内存.cpp : Defines the entry point for the console application.
//


#include "stdafx.h"
#include <stdio.h>



/*
1.5  (10) = 1.1*2^0  (2)  //0x 3f c0 00 00 /00 00 C0 3F
3    (10) = 1.1*2^1  (2)  //0x 40 40 00 00 /00 00 40 40
0.75 (10) = 1.1*2^-1 (2)  //0x 3f 40 00 00 /00 00 40 3F
*/

//切记float和double是用指数来保存的
// float 类型的内存保存机制


/*
float类型占据4个字节(可以用sizeof关键字求出)内存就占据32位
32位就是0-31; 且把0当做最高位31当做最低位
最高位为1就此浮点数为负否则为正也就是最高位0
跟着的后8位就是阶码跟着阶码后面的就为尾数共23位
*/


void main1() //求出float的内存的大小
{
printf("%d\n",sizeof(float));
}


void main2()
{
float fl=1.5; //此数最高位就为0
printf("%x\n",&fl);


float fl1=-1.5;//此数最高位就为1
printf("%x\n",&fl1);

}


void main()
{
float f1=12.5;
float f2=-12.5;
printf("%p\n",&f1);//0x41480000内存中Hex
printf("%p\n",&f2);//0xB1480000内在中Hex
/*
首先十进制浮点数  整数按照二进制 小数可以通过*2取整来得到
12.5=12+0.5
12二进制就是1100
0.5的二进制是0.5*2=1.0取整就是1 所以1.5的二进制就是1100.1;
1100.1就为二进制再去转换成内存中保存的Hex
浮点数保存时要底数要求是:1<底数<2 =1.1001*2^3
**************************************
1、12.5为整数最高位为0
2、而阶码就是指数+127=127+3=130 把130化作二进制 
//相反如果是二进制推出十进制浮点数 8位阶码的二进制化成十进制就要减去127
3、取二进制后的小数点的数


结果:
  符号位   阶码                尾数
0    10000010     10010000000000000000000


0100 0001 0100 1000 0000 0000 0000 0000
 4   1    4     8    0    0    0    0
******************************************
1、-12.5为整数最高位为1
2、而阶码就是指数+127=127+3=130 把130化作二进制
3、取二进制后的小数点的数


结果:
  符号位   阶码                尾数
0    10000010     10010000000000000000000


1100 0001 0100 1000 0000 0000 0000 0000
   C       1        4         8        0        0        0        0     

*/

}


/*******************************************************************/


#include "stdafx.h"
#include <stdio.h>


// double 类型的内存保存机制


/*
double类型占据8个字节(可以用sizeof关键字求出)内存就占据64位
64位就是0-63; 且把0当做最高位63当做最低位
最高位为1就此浮点数为负否则为正也就是最高位0
跟着的后11位就是阶码跟着阶码后面的就为尾数共52位
*/


void maina()//求出double的内存的大小
{
printf("%d\n",sizeof(double));


}
void mainb()
{
double fl=1.5; //此数最高位就为0
printf("%x\n",&fl);


double fl1=-1.5;//此数最高位就为1
printf("%x\n",&fl1);

}


void main()
{
double f1=12.5;
double f2=-12.5;
printf("%p\n",&f1);//0x4029000000000000内存中Hex
printf("%p\n",&f2);//0xC029000000000000内存中Hex
/*
首先十进制浮点数  整数按照二进制 小数可以通过*2取整来得到
12.5=12+0.5
12二进制就是1100
0.5的二进制是0.5*2=1.0取整就是1 所以1.5的二进制就是1100.1;
1100.1就为二进制再去转换成内存中保存的Hex
浮点数保存时要底数要求是:1<底数<2 =1.1001*2^3
**************************************
1、12.5为整数最高位为0
2、而阶码就是指数+1023=1023+3=1026 把1026化作二进制 
//相反如果是二进制推出十进制浮点数 11位阶码的二进制化成十进制就要减去1023
3、取二进制后的小数点的数


结果:
  符号位      阶码                       尾数
0    10000000010   1001000000000000000000000000000000000000000000000000 


0100 0000 0010 1001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 
    4        0        2        9       0        0        0        0        0         0        0       0        0         0       0        0       0        0
******************************************
1、-12.5为整数最高位为1
2、而阶码就是指数+1023=1023+3=1026 把1026化作二进制
3、取二进制后的小数点的数


结果:
  符号位   阶码                尾数
0    10000000010   1001000000000000000000000000000000000000000000000000 


1100 0000 0010 1001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 
  C        0        2        9       0        0        0        0        0         0        0       0        0         0       0        0    





*/
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值