C语言中浮点型在计算机中的存储

一 . 浮点型的存储

       在十进制中我们都学习过科学计数法,比如31.4可以用科学计数法表示就是3.14*10^1。浮点型同样是采取科学计数法进行表示的。在计算机中,以二进制数存储,如1011.10用科学计数法的方式可以写成1.01110*2^3,因为浮点型还有负数,所以在计算机中表示时还需要加上一个符号位,这样我们就可以总结出一般的浮点型数据的表示形式:(-1)^S*M*2^E。

      其中,(-1)^S是符号位。 M是尾数位,即上例中的1.01110,E是指数位,这样我们把一个浮点型的存储单元分成三部分。又浮点型在计算机中是4个字节,一个32个bit位,设计者把这32个bit位分为1,8,23,的形式,其中1位最高位是符号位,8位是指数位,23位是尾数位。

      (1)符号位

         最高一位符号位, 实际上就是用0正1负表示。

       (2)尾数位

         又我们知道任何一个二进制小数都可以写成是1.xxx*2^E,所以M的值一个是大于1且小于2的,这样我们就默认的省去了最前面的1,这样M省出一个位,可以表示的范围更大。所以M中存储的实际是0.xxx中的xxx的部分,如上例中的1.01110*2^3,M的中存储的实际是01110。此处还应该注意的是,在M中存储01110的时候是靠前存储的,即23个位表示为0111 0000 0000 0000 0000 000。为什么要这样表示呢,这是因为如果01110靠后存储的时候没办法确定有1的前面应该读取几个0。再举一例,如1.000000010111*2^3的时候,M的值应该是0000 0001 0111,在23中如果靠前存储是0000 0001 0111 0000 0000 000,这样我们很容易读取0000 0001 0111,并且如果后面多取0时,所表示的值的大小并不改变。而如果是靠后存储时,则是0000 0000 0000 0000 0010 111,这样我们就无法知道1的前面应该取几个0。

     (3)指数位

        E是指数位,E的计算机中是无符号整数,它的取值范围是0---255,但是这和我们的现实生活中又不一样了,我们知道在实际生活中,E可以是正数也可以是负数,那么计算机如何表示这个负数呢。设计者在设计的时候,让指数的实际值加上127之后再转化成二进制数进行存储,有同学不就会疑惑,这样它的不就增大了,那它就与实际值不符啊。这里在读取的时候又做了另一步操作,就是把E(二进制数)转化成十进制后,再减去127这样就还原成原来的样子了。这样处理之后,E的实际表示的范围就是-127---128。补充说明,如果E为全0,则实际表示的是-127,这样这个数很很小,几乎接近于0,计算机就默认把它当成了0,进行表示。

二 . 浮点型的读取

    用%f去读取一个数据时,首先将其划分成1,8,23的形式,先读取符号位,0正1负。接着读取指数位E,将得到的8bit的二进制数,转化成十进制后再减去127。最后读取尾数位,从前读取的值当成是小数点后面的数字,默认小数点前面有一个1,这样就把浮点型数据读取出来了。如1 1011 1000 0110  0000 0000 0000 0000 000,从前面取以为1,则表示负;接着取后八位1011 1000指数位,将其转化成十进制数是184再将其减去127得57;再读取后面的23个位,得011,那么它的M就是011,在前面加上默认的1,那么这个尾数就是1.011,。所以这个浮点数就是-1.011*2^57。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值