float a=1.0f在内存中的表示是3f800000,这个3f800000是怎么得出的(转)

3f800000H=0 01111111 00000000000000000000000B

符点型数据在X86机上占四个字节,其存储按IEEE754标准实现,即:
1位的符号位s         0(代表正数,1代表负数)
8位的指数位e(移码表示)01111111是0的移码  //这个对吗???(对的,须减去127才是真正的指数)
参考链接:http://blog.chinaunix.net/uid-20937170-id-3396073.html
	http://www.cnblogs.com/jillzhang/archive/2007/06/24/793901.html
23位的小数位f  0000000000000000000000 表示小数部分为0
计算机在表示符点数时,要将10进制数转成二进制的规范数形式进行存储的。即:1.f*2^e在存储时,小数前面的1是隐式存储的,不体现在数据中。
现在翻译一下:
1.f*2^e 指的是二进制。
3f800000H=1.0*2^0=1.0
给你一个比较标准的答复: 浮点数转化为整数时,是取整,而化为整数引用时 (int&)a 相当于 *(int*)&a。 所以 float a=1.0f; (int)a 和 (int&)a 是不同的,1.0f在内存中是 3F800000,作为int看待的话是1065353216,所以(int)a等于1,(int&)a等于1065353216。 而之所以当b=0.0f时,(int)b 和 (int&)b 相等,是因为0.0f和0的内存布局正好一致,都是 00000000。
 
 
 
 
移码 :普及一下
计算机中的移码
用补码表示阶码的时候,当阶码无限小,产生了下溢的时候,阶码变成了0,那么这个浮点数的值变为了1。
而实际上这个数是无限接近于零的。那么我们就需要取出其中的 "-0“ 值作为机器零,于是移码产生了。
移码(又叫增码)是符号位取反的补码,一般用做浮点数的阶码,引入的目的是为了保证浮点数的机器零为全0。
①移码的定义:设由1位符号位和n位数值位组成的阶码,则 [X]移=2En + X -2n≤X ≤ 2n
例如: X=+1011 [X]移=11011
X=-1011 [X]移=00101
②移码与补码的关系: [X]移与[X]补的关系是符号位互为相反数(仅符号位不同),
例如: X=+1011 [X]补=01011 [X]移=11011
X=-1011 [X]补=10101 [X]移=00101
③移码运算应注意的问题:
◎对移码运算的结果需要加以修正,修正量为2En ,即对结果的符号位取反后才是移码形式的正确结果。
◎移码表示中,0有唯一的编码——1000…00,当出现000…00时(表示-2En),属于浮点数下溢。
//。上面的这种理解好像不太正确
看下文

单精度浮点数: 1位符号位   8位阶码位   23位尾数

双精度浮点数: 1位符号位   8位阶码位   52位尾数

 

实数在内存中以规范化的浮点数存放,包括数符、阶码、尾数。数的精度取决于尾数的位数。比如32位机上float型为23位       double型为52位。

单精度float型存储在内存中的大小为4个字节,即32位。

浮点表示的一般形式为:R=M*2^e (R:Real       M:Mantissa尾数     e:exponent阶码)

把上面float的二进制可分成三部分:

   x                   xxxxxxxx             xxxxxxxxxxxxxxxxxxxxxxx

数符(1b)         阶码(8b)         尾数(23b)

double型的浮点数分别是:数符(1b)、阶码(8b)、尾数(52b)

数符sign:real的正负号     "+":0        "-":1

阶码e:e=E-127(double型中e=E-1023) e为正值说明这个浮点数向左移动了e位, e为负值说明这个浮点数向右移动了e位。127=2^7-1 1023=2^10-1

尾数M:有效数字位,这里是有效数字位的部分二进制码

例1:float型浮点数125.5转化成32位二进制浮点数

125.5的二进制码为1111101.1,写成二进制的科学计数为:1.111101*2^6(因为科学计数法“整数”部分大于1,在二进制中,“整数”部分只能恒为1)即向左移6位,则e=6,则E=e+127=133,而E的二进制码为10000101,而1.111101把“整数”部分去除1之后为111101,之后补0,共23b,形成了阶码。

所以125.5的32位二进制浮点数为

0 10000101 11110100000000000000000

例2:float型浮点数0.5转化成32位二进制浮点数

0.5的二进制码为0.1,写成二进制的科学计数为:1.0*2^(-1)即向右移1位,则e=-1,则E=e+127=126,而E的二进制码为01111110,而1.0把“整数”部分去除1之后为0,之后补0,形成了阶码。

 

所以0.5的32位二进制浮点数为

0 01111110 00000000000000000000000

double型浮点数类似。

例3:32位二进制浮点数为0 10000010 00010000000000000000000转化成十进制数浮点数

题中已给我们分了三部分,数符部分、阶码部分、尾数部分。

数符部分为0,则代表此数为正数;阶码部分为10000010,则E=130,则e=E-127=3,则说明其向左移了3位,0001加上“整数”部分的1之后,为1.0001。则原二进制数为1000.1=十进制8.5,或R=1.0001*2^3=8.5

其中很多计算类似。可举一反三!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值