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

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。

更多相关:

  • 想要获取磁盘前四个扇区的内容可以先将扇区内容从磁盘dd出来,使用如下命令 dd if=/dev/sdb of=mbr.txt bs=1 count=2048 改命令将sdb磁盘的前2048个字节内容即4个扇区内容备份到文件mbr.txt里面。 其中bs为块大小1即为1个字节,count表示块个数,即2048个字节。一个扇区默认为512...

  • pcl_common库包含大多数PCL库使用的公共数据结构和方法。核心数据结构包括PointCloud类和许多用于表示点、表面法线、RGB颜色值、特征描述符等的点类型。它还包含许多用于计算距离/范数、均值和协方差、角度转换、几何变换,等等。这个模块是不依赖其他模块的,所以是可以单独编译成功,单独编译出来可利用其中的数据结构自行开发,当...

  • 一. 字符型的分类和表示范围        char:是有符号还是无符号数视编译器而定,一般为有符号数,下文把它全部当成有符号数进行讨论                    表示范围:32位和64位机器上均是一个字节,所以是八个bit位,最高位为符号位之后,后七位是数据位,所以它的取值范围是-128---127(-2^7---2...

  • 第五章 [BX]和loop 1.内存单元间接表示: [bx] mov  dl, [0];  dl  ←  ((ds)×16 + 0) mov  bx, 0 mov  dl, [bx];  dl  ←  ((ds)×16 + (bx)) 可以使用bx间接访问内存单元。默认,段地址在ds。   2.loop指令 (1) 语法格式    ...

  • 1. Container Bootstrap中容器类提供了2个类标识:container、container-fluid。 两者的区别在于:container:容器不止有15px的padding,还有一个随着浏览器宽度变化而变化的margin。container-fluid:只有固定的15px的padding。 因此,containe...

  • Servlet API: javax.servlet.http.HttpServletResponse 用于创建HTTP响应,包括HTTP协议的状态行、响应头以及消息体 HTTP状态码: 100-199:表示信息性代码,标示客户端应该采取的其他动作,请求正在进行。 200-299:表示客户请求成功。 300-399:表示用于已经移走的...

  •   cd 到盘符 例如D:. cd 到您的项目目录 去gitlab对应项目拷贝http的克隆地址  然后在gitlab命令窗口输入  git clone http://192.168.2.231/knowway/******.git 接下来就开干!!! 打开webstorm然后ctrl+alt+s  ...

  • 工作中遇到如下业务场景: 我需要利用大批量的key去借助MGET命令来获取redis服务器上的记录,但是我却始终获取不到。当然我可以使用GET去一条一条地获取,但是这样一来,效率不高。所以最好的方式是,大批量一次性获取这样的记录。 我有问题的这段代码是这样的: 但是在构造MGET命令时,我犯了一个很弱智的错误,就是redi...