串口怎么发浮点型数据出来_冯老师来教你浮点数(float型数据)在计算机内存里是怎么存储的...

4abc97a3cea79e4c54f10410642f2784.png
循序渐进C++

定义数据类型的意义

C++语言中定义数据类型的意义有三点

  • 数据类型决定存储空间
  • 数据类型决定数据的取值范围
  • 数据类型决定了数据可以做哪些运算

1.整型(int)数据类型的存储空间、取值范围及运算

例如int类型数据,取值范围如图1所示

276abeb6fa8281b01fb9cd2611fa2d99.png
图1 整型数据的存储空间及取值范围

定义了int型变量,那么就是4个字节,取值范围30b84ccf1805fb5a99d642096962d22b.png

可以做算数运算,加减乘除取余,可以做关系运算,逻辑运算,可以进行按位运算和移位运算等等。

2.浮点数的存储表示

单精度浮点数(float类型),分配4个字节存储空间,取值范围如下:

954c67606462c3b615fbca418ad36228.png浮点数可以做加减乘除这样的算数运算,关系运算和逻辑运算,但不能做取余运算,也不可以做移位和按位运算,可见其操作不同于整数了。

今天冯老师就给你分析为什么是这个取值范围,换句话说,浮点数的内部表示是怎样的呢?

6795f3c6752c06144ce39a6583ea9f62.gif

3.十进制浮点数

首先我们先看十进制浮点数,在十进制数中,通常一个浮点数可以用科学计数法表示,例如0f264b5bada81e0feddbef704c86c94f.png

4.十进制浮点数转换成二进制浮点数

在计算机内部,浮点数都是以二进制表示的,所以,对于十进制浮点数,要先转换为二进制浮点数。分两步

  • 整数部分转换

除2取余法,如:53b014577de0b7e17478334481cfc98a.png

  • 小数部分转换

乘2取整法,如:b656e6371baa6d0ff6ec1dbdf201c12e.png

下面是0.8125和0.6转换成二进制表示

b7085f3c5ed02199138523e17a3ebc97.png

5.二进制浮点数的尾数及规格化

二进制数也要像十进制数一样进行规格化,二进制的规格化同样是调整二进制的阶码,使二进制的有效值在1~2之间,即二进制的整数部分为1,那么,0.8125进行规格化如下所示:659f57cc4016847ca32f0219f3ff23e6.png

计算机内部把二进制分为3段表示:(32位浮点数据)

  • 第一段符号位  占1位
  • 第二段阶码位  占8位
  • 第三段尾数为  占23位

如果是64位双精度浮点型(double)也是3段表示

  • 第一段符号位  占1位
  • 第二段阶码位  占11位
  • 第三段尾数为  占52位

为什么二进制规格化与十进制不同呢,我们想一想,如果二进制也像十进制一样要求整数为0,小数部分第一位非0,那么小数点后第一位肯定就是1,因为二进制非0则1,那么这个固定的1就占去了宝贵的一位,因此,就把这个1前移1位,从而增加一个有效位。因此:

0.6=0.10011001100110011001……

=1.00110011001100110011……(这样精度就多了1位)

其精度或有效为是24位

6.二进制浮点数的阶码

二进制尾数规格化提高了一位精度,但是牺牲了浮点数0的常规表示,因为规格化要求小数点前必须是1,所以即使尾数部分都是0,浮点数的有效值也是1,但是浮点数0的运算比不可少,那么0在浮点数中是如何表示的呢?float的第二段阶码位是8位,取值为-128~127,共256个值,但是-127和-128有特殊的用处,因此,阶码取值为-126~127,-128表示操作错误,如被0除或超出浮点数的表示范围,-127表示非规格化数据 为了使浮点数0和整数0统一,即位码全0表示0,将一切阶码都加了127,取出该浮点数时候再做减去127的逆操作。那么看下图

2986c3ddefe79b48b2dd2d39f26afe55.png

7.浮点数表示范围

对于单精度浮点型,阶码8位,可以表示正负,当尾数全1,再加上小数点前1位,阶码取到最大时为127,浮点数可以取到正负数的最大值:a03779f028568f46ca6de8f8a2c60ebc.png

精度呢?有24位表示精度,

7ff0c4a450a8344ef4a5a65b70d22740.png所以精度相当于10进制的7位。73eb812a4f0250a4465d6ec8eec493e6.png

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值