最近在学习C Primer Plus。书中第66页,3.8 关键概念 这一小节中有这一段话:

“计算机中的浮点数和整数在本质上不同,其存储方式和运算过程有很大区别。即使两个 32 位存储单元存储的位组合完全相同,但是一个解释为 float 类型,另一个解释为 long 类型,这两个相同的位组合表示的值也完全不同。例如,在 PC 中,假设一个位组合表示 float 类型的数 256.0,如果将其解释为 long 类型,得到的值是 113246208。C 语言允许编写混合数据类型的表达式,但是会进行自动类型转换,以便在实际运算时统一使用一种类型。“

 

我自己的理解是:有两个长度为32位的存储空间有同样的位组合,它们分别存储了 float 和 long 两种类型。但因为 float 和 long 在计算机中的存储方法和形式不同,导致了输出的值不同。

抛出问题:在验算中我得出的 long 类型的结果为 1132462080,和原文结果不同,较书上数字多了一位 0。

首先探讨 float 数据类型的存储形式。

浮点型变量在计算机内存中占用4个字节(4 Byte),即32-bit。这 32 位的存储空间为SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM 的格式。

S部分:数符。表示浮点数的正负,1为负数,0为正数。

E部分:阶码。指数加上127后的值的二进制数。

M部分:尾数。规格化表示后底数去除整数位1的二进制数。

Single precision单精度浮点数和 float 浮点数存储形式相同

*规格化的步骤:

(1)将 float 转化为二进制形式。

(2)用科学计数法表示第一步得到的二进制数,得到的指数加127既是E部分的阶码。

(3)科学计数法的小数部分,即M部分的尾数。

最后可以得到浮点数256.0的存储形式:

0100(SEEE)      0011(EEEE)       1000(EMMM)      0000(MMMM)

0000(MMMM)   0000(MMMM)     0000(MMMM)     0000(MMMM)

32位的存储空间里包含了1个S,代表正负;8个E为指数。实质上就是这个浮点数其数值的数量级;23个M,即这个数本身由哪些数字组成。

实质上这个32位存储空间就是科学记数法的二进制”变种“,它包含了正负、数字和数量级,即表示了一个数。

#两点补充:(1)为什么要给指数加127才是阶码?答:浮点数的指数可正可负,指数E的存储空间是带符号的8位。所以根据IEEE标准,float 的指数取值范围为 -126 到 128,需要加上127来取消负数情况。(2)为什么尾数是规格化后底数去掉整数位 1 的二进制数?答:科学记数法后底数部分实际是占用24bit 的一个值,但是最高位始终为1。所以最高位省去不存储,在存储中占23bit。

关于 long 长整型数的存储格式,我并没有查到太多的相关资料,大多都是与 int、long long 相关等等。因该就是除了原码、反码、补码相关知识之后,直接首位表正负,其他二进制码就是它的数值。

所以把浮点数 256.0 的 32 位存储形式0100 0011 1000 0000 0000 0000 0000 0000转化为 long 得到 1132462080,而非书上的 113246208 。

这篇文章的本意是借此机会,来记录一下学习了数据类型存储形式和方法的知识成果。如果能有大神解决了我的问题,那更是再好不过!附上一条帮助我很多的博客的链接:https://www.cnblogs.com/chris-cp/p/4321793.html#undefined

分享读C Primer Plus时遇到的一个问题(补档5月7日)的更多相关文章

  1. [分享] 从定制Win7母盘到封装详细教程 By BILL ( 10月23日补充说明 )

    [分享] 从定制Win7母盘到封装详细教程 By BILL ( 10月23日补充说明 ) billcheung 发表于 2011-10-23 00:07:49 https://www.itsk.com ...

  2. 开机时自动启动的AutoHotkey脚本 2019年10月09日

    ;;; 开机时自动启动的AutoHotkey脚本 2019年10月09日;; http://www.autoahk.com/archives/16600; https://www.cnblogs.co ...

  3. sql 计算两时间或日期 的相差的 年、 月、 日、时、分、秒,年、月、日分别的提取

    --年.月.日.时.分.秒 datediff(yy,date1,date2) datediff(m,date1,date2) datediff(d,date1,date2) datediff(hh,d ...

  4. 开机时自动启动的AutoHotkey脚本 2019年07月08日19时06分

    ;;; 开机时自动启动的AutoHotkey脚本;; 此脚本修改时间 2019年06月18日20时48分;; 计时器创建代码段 ------------------------------------ ...

  5. struts2练习时犯的错误(2016年11月4日)

    1.Tomcat启动时报错 严重: 文档无效: 找不到语法. at (null:3:8) org.xml.sax.SAXParseException; systemId: file:/F:/Progr ...

  6. 微信公众号的分享接口,分享提示config:fail,invalid signature的解决办法(2017年12月)

    微信中打开网页,使用微信右上角菜单中自带的分享功能的经历及总结: 最开始,微信分享页面时,直接读取页面的标题(title)和页面中的第一张符合条件的图片[此种方式在2017-03-29之前管用,这一天 ...

  7. 自学C Primer Plus时还没想明白的问题

    2016年11月24日 1. 计算机中两个浮点数怎样进行加法运算.2. 为什么计算机在计算时存在损失精度的可能3. 无符号数和有符号数的运算是怎样的4. printf中使用格式控制符的截断问题,比如% ...

  8. 安装dede UTF_8时报出了一个致命错误和警告,最后不能显示网站后台和首页了

    安装dede UTF_8时报出了一个致命错误和警告,最后不能显示网站后台和首页了.报错如下: 登陆首页显示:Fatal error: Call to undefined function ParCv( ...

  9. Java 获取各时区时间,获取当前时间到格林威治时间1970年01月01日00时00分00秒的秒数

    格林威治时间即UTC/GMT时间,1970年01月01日00时00分00秒(即UTC+8的北京时间1970年01月01日08时00分00秒)计算代码如下: /** * 获取指定时间到格林威治时间的秒数 ...

随机推荐

  1. 微信开发(一)URL配置

    启用开发模式需要先成为开发者,而且编辑模式和开发模式只能选择一个,进入微信公众平台-开发模式,如下: 需要填写url和token,当时本人填写这个的时候花了好久,我本以为填写个服务器的url就可以了( ...

  2. python之函数名,闭包、迭代器

    一.函数名的运用(第一类对象) 函数名是一个变量,但它是一个特殊的变量,与括号配合可以执行函数的变量. 1,函数名的内存地址: def func(): print("呵呵") pr ...

  3. 记录一下在SpringBoot中实现简单的登录认证

    代码参考博客: https://blog.csdn.net/weixin_37891479/article/details/79527641 在做学校的课设的时候,发现了安全的问题,就不怀好意的用户有 ...

  4. Storm编程入门API系列之Storm的Topology多个Workers数目控制实现

    前期博客 Storm编程入门API系列之Storm的Topology默认Workers.默认executors和默认tasks数目 继续编写 StormTopologyMoreWorker.java ...

  5. 安卓,IOS真机调试

    移动端前端开发真机调试攻略 有线调试: 一.IOS 移动端 (Safari开发者工具) 手机端:设置 → Safari → 高级 → Web 检查器 → 开. mac端:Safari → 偏好设置 → ...

  6. dispaly:none 和visibility :hidden的区别

    display:none 通常被 JavaScript 用来在不删除元素的情况下隐藏或显示元素. 它和 visibility 属性不一样.把 display 设置成 none 元素不会占据它本来应该显 ...

  7. [转]SqlServer索引的原理与应用

    索引的概念 索引的用途:我们对数据查询及处理速度已成为衡量应用系统成败的标准,而采用索引来加快数据处理速度通常是最普遍采用的优化方法. 索引是什么:数据库中的索引类似于一本书的目录,在一本书中使用目录 ...

  8. Nacos部署中的一些常见问题汇总

    开个帖子,汇总一下读者经常提到的一些问题 问题一:Ubuntu下启动Nacos报错 问题描述 使用命令sh startup.sh -m standalone启动报错: ./startup.sh: 78 ...

  9. 从零开始利用vue-cli搭建简单音乐网站(四)

    上一篇文章中说到这一篇博客会实现音乐播放功能,只是令我意外的是,如果利用h5的audio标签,几行代码就实现了......先来看一下最终效果吧. 这里直接用了audio标签,样式没有怎么管,能获得音乐 ...

  10. 使用 PHPUnit 和 Selenium 进行测试

    适用于 PHP 的 NetBeans IDE 支持 PHPUnit 自动测试.通过 PHPUnit,NetBeans IDE 可为 PHP 提供代码覆盖率,这与 IDE 为 Python 提供的代码覆 ...