计算机组成原理【CO】Ch2 数据的表示和应用

news2024/10/6 22:33:17

文章目录

  • 大纲
    • 2.1 数制与编码
    • 2.2 运算方法和运算电路
    • 2.3 浮点数的表示和运算
  • 【※】带标志加法器
    • OF
    • SF
    • ZF
    • CF
    • 计算机怎么区分有符号数无符号数?
  • 【※】存储排列和数据类型转换
    • 数据类型大小
    • 数据类型转换
  • 进位计数制
    • 进制转换
    • 2的次幂
  • 各种码的基本特性
  • 无符号整数的表示和运算
  • 带符号整数的表示和运算
  • 码之间的转换
  • 移位运算
    • 算数移位【针对有符号数】
    • 逻辑移位【针对无符号数】
    • 循环移位
  • 乘除运算
    • 无符号整数
    • 有符号数
  • 【※】IEEE754
    • IEEE754浮点数与真值相互转化
      • 由浮点数确定真值(阶码不是全0、也不是全1) :
    • 浮点数的加减运算
  • C强制类型转换
  • 浮点数的规格化

大纲

2.1 数制与编码

  • 王道书和大学教材讲到原码、补码时,使用了数学化的语言来讲解,不用过于深究,不是重点。计组这门课在考试中只考察应用,不考数学原理。对补码的数学原理感兴趣的同学,可以研究《数论》。
  • 这个小节学起来难,但做起题来不算难。不建议反复死磕视频和王道书,可以先学一遍,然后直接做题,用“做题驱动复习”。

2.2 运算方法和运算电路

  • 本节内容较多,一天的时间可能学不完。建议大家按照“伴学营打卡表”推荐的顺序做题,学一部分,做几道题。不建议一口气全部看完再去做题,那样一定消化不了。
  • 对于没学过《数字电路》的同学,串行加法器、并行加法器的底层原理一定很难理解。不过没关系,考试不可能考太底层的电路设计。
  • 带标志位的加法器是考试重点,也是经常结合第四章考察的重点,需要认真理解。OF、SF、ZF、CF 标志位的生成和作用一定要掌握。
  • 乘法、除法的原理细节不容易理解,但考察频率较低,第一次学如果觉得难,也不建议花太多时间。只需要先建立起这个认知:在计算机硬件层面,无论是乘法还是除法,都是通过 加法、减法、移位运算 来实现的。
  • C语言中各种数据类型的存储和相互转换、数据的存储和排列,这两部分内容很重要,经常结合大题考察,需认真理解。

2.3 浮点数的表示和运算

  • 本节又是一块硬骨头,没什么好说的,学吧。第一次学难免让人怀疑人生,保持平常心尽力去学尽力去做题就好。第一次学习不建议死磕细节,得配合做题来体会这个部分怎么考,用“做题驱动复习”。
  • 但很多同学的反馈是:“第一次学感觉很复杂,但第二轮回来复习感觉也没那么难”。原因是,本节内容虽难,但在经过做题训练之后,大家都会更清晰的认识到 “哪些地方是考试重点”、““哪些地方应该是我重点关注的”。

【※】带标志加法器

OF

  • 有符号数的加减运算是否发生了溢出。
  • OF=1时,说明发生了溢出
  • OF=最高位产生的进位 ⊕ 次高位产生的进位
  • OF位对无符号数的加减法无意义

SF

  • 有符号数加减运算结果的正负性。
  • SF=0表示运算结果为正数,SF=1表示运算结果为负数
  • SF = 最高位的本位和(也是结果的最高位)
  • SF位对无符号数的加减法无意义

ZF

  • 表示运算结果是否为0。
  • ZF=1表示运算结果为0,ZF=0表示运算结果非0
  • 两个数的运算结果为n bit,只有n bit全为0时,ZF =1
  • 对有符号、无符号都有意义

CF

  • 进位、借位标志

  • 表示无符号数的加减法是否发生了进位或借位

  • 当CF=1时,说明无符号数的加减法发生了进位或借位,即发生了溢出

  • CF=最高位产生的进位⊕sub

    • sub=1,表示减法
    • sub=0,表示加法
  • CF位对有符号数的加减法无意义

  • 有符号数的加减运算是否发生了溢出。

  • OF=1时,说明发生了溢出

  • OF=最高位产生的进位 ⊕ 次高位产生的进位

  • OF位对无符号数的加减法无意义
    在这里插入图片描述

计算机怎么区分有符号数无符号数?

  • 标志位会保存在PSW,ALU无法区分有符号数和无符号数,但由于计算机分为无符号加法和有符号加法。指令不同,执行时安排的微操作不同,从而区分有符号数和无符号数。

【※】存储排列和数据类型转换

数据类型大小

  • char:1B
  • short:2B
  • int:4B
  • float:4B
  • long:4B
  • double:8B

Tips:

  • C语言中定点整数是用补码存储的

数据类型转换

整数之间转换(带符号和无符号之间)

  • 长度相同
    • 机器数不变,解释方式改变
  • 短变长
    • 先扩展:
      • 无符号数补0
      • 有符号数补符号
    • 再解释
  • 长变短
    • 直接截断,只留下低位
    • 再解释

整数与浮点数之间的转换

  • 整数转浮点数:
    • 先转换为2进制,写出科学记数法1.xxxx,再转为浮点数,截断尾部采用0舍1入的原则
    • ⚠️可能精度丢失
  • 浮点数转整数:
    • 写出二进制小数,去掉小数部分,整数部分保留更低的位数
    • ⚠️可能溢出、精度丢失

进位计数制

进制转换

  • 二进制 <-> 八进制:每3个二进制位对应一个八进制位
  • 二进制 <-> 十六进制:每4个二进制位对应一个十六进制位
    • 【PS:整数部分前面补0,小数部分后面补0】
  • 十进制 -> 进制
    • 整数部分:除基取余法,先取得的“余”是整数的低位
    • 小数部分:乘基取整法,先取得的“整”是小数的高位

2的次幂

次幂2的次幂
-40.0625
-30.125
-20.25
-10.5
01
12
24
38
416
532
664
7128
8256
9512
101024
112048
124096
138192
1416384
1532768
1665536

各种码的基本特性

在这里插入图片描述

无符号整数的表示和运算

• 加法
• 全部位按位相加
• 减法
x − y = x + [ − y ] x-y=x+[-y] xy=x+[y]
[ − y [−y [y]是 [ y ] [y] [y]从右往左第一个1的左边全部取反
• 溢出
• 手算:判断加减法的结果是否超出无符号数合法表示范围
• 机算: C F = 最高位进位 ⊕ S u b CF = 最高位进位 ⊕ Sub CF=最高位进位Sub

带符号整数的表示和运算

Tips:
• 计算机内部,所有带符号整数的加减法都要先转换为补码

计算机硬件如何做带符号数补码的加法:
• 从最低位开始,所有位按位相加(符号位参与运算),并往更高位进位

计算机硬件如何做带符号数补码的减法:
• "被减数”不变,“减数”从右往左找到第一个1,这个1左边的全部位按位取反减法变加法

有符号数:
• 加法
• 按位相加
• 减法
[ x ] 补 − [ y ] 补 = [ x ] 补 + [ − y ] 补 [x]_补 - [y]_补 = [x]_补 + [−y]_补 [x][y]=[x]+[y]
[ − y ] 补 是 [ y ] 补 [−y]_补 是 [y]_补 [y][y] 从右往左第一个1的左边全部位按位取反
• 溢出
• 手算:判断加减法的结果是否超出有符号数合法表示范围
• 机算: O F = 最高位进位 ⊕ 次高位进位 OF = 最高位进位 ⊕ 次高位进位 OF=最高位进位次高位进位

码之间的转换

在这里插入图片描述

  • [x]_移→[−x]_移:全部位按位取反,末位+1
  • 使用补码表示时,若符号位相同,则数值位越大,码值越大

[ x ] 原 → [ x ] 反 ? [x]_原→[x]_反? [x][x]
• 正数:不变
• 负数:符号位不变,数值位按位取反
[ x ] 原 ↔ [ x ] 补 ? [x]_原↔[x]_补? [x][x]
• 正数:不变
• 负数:符号位不变,从右往左找到第一个“1”,这个1左边的所有“数值位”按位取反
[ x ] 补 ↔ [ − x ] 补 ? [x]_补↔[−x]_补? [x][x]
• 从右往左找到第一个“1”,这个1左边的全部位按位取反
[ x ] 补 ↔ [ x ] 移 ? [x]_补↔[x]_移? [x][x]
• 符号位取反

如何用补码快速计算真值:
- 直接在补码前面加上负号,再计算值
○ Eg: [ 1110 ] 补 = − 2 3 + 2 2 + 2 = − 2 [1110]_补 = −2^3 + 2^2 + 2 = −2 [1110]=23+22+2=2
- 遇到一大串的1,将其看作符号位,直接化为最简,再用上述方法
○ Eg: [ 11111110 ] 补 = [ 10 ] 补 = − 2 [11111110]_补 = [10]_补 = −2 [11111110]=[10]=2

如何快速求真值的补码:
eg: − 8190 = − 8192 + 2 = [ 1110 , 0000 , 0000 , 0010 ] 补 = E 002 H −8190 = −8192 + 2 = [1110,0000,0000,0010]_补 = E002H 8190=8192+2=[1110,0000,0000,0010]=E002H

移位运算

算数移位【针对有符号数】

  • 左移1位相当于乘基数;右移1位相当于除基数,但由于位数有限,所以有时候算数移位并不能完全等效于乘除运算。
  • 是针对有符号数:符号位保持不变。
    • 正数:原码、反码、补码,无论左移还是右移都是补0
    • 负数:
      • 原码左移、右移都补0
      • 反码左移和右移都补1
      • 补码左移补0,右移补1
  • 若采用双符号位来表示数,则最高符号位永远是真正的符号位,因此在算术移位时只有高符号位保留不变,低符号位要参与移位

逻辑移位【针对无符号数】

  • 针对无符号数。符号位参与,左移、右移都补0,移出的位舍弃

循环移位

  • 不带进位位
    • 用移出的位补上空缺
  • 带进位位
    • 移出的位放到进位位,原进位位补上空缺

乘除运算

无符号整数

  • 逻辑左移代替*2
  • 溢出判断:
    • n位乘n位,若用2n位保存乘积,则不会溢出
    • n位乘n位,若用2n位保存中间结果,最后截取末尾n位作为最终的乘积,则可能溢出
      • 当且仅当2n的前n位都是0时才不会溢出

有符号数

  • 算术左移代替*2
  • 溢出判断:
    • n位乘n位,若用2n位保存乘积,则不会溢出
    • n位乘n位,若用2n位保存中间结果,最后截取末尾n位作为最终的乘积,则可能溢出
      • 当且仅当2n的前n+1位是全0或全1时才不会溢出

【※】IEEE754

在这里插入图片描述

IEEE754浮点数与真值相互转化

由浮点数确定真值(阶码不是全0、也不是全1) :

  • 划分“某浮点数”,确定数符、阶码、尾数的分布
  • 确定尾数1.M(注意补充最高的隐含位1)
  • 确定 阶码的真值 = 移码 − 偏置值 阶码的真值 = 移码-偏置值 阶码的真值=移码偏置值 (可将移码看作无符号数,用无符号数的值减去偏置值)
  • ( − 1 ) s × 1. M × 2 ( E − 偏置值 ) (-1)^s × 1.M × 2^{(E - 偏置值)} (1)s×1.M×2(E偏置值)

浮点数的加减运算

对阶

  • 目的:使两个操作数的小数点位置对齐
  • 对阶操作只把较小的阶码调整到较大的阶码【所以不会引起阶码的上溢或下溢】
  • 阶码增大,尾数右移
  • 无阶码减小的情况【因为只用小阶向大阶对齐】

尾数求和

  • 原码定点数的加减法

规格化

  • 尾数规格化为1.xxxx的形式

舍入

  • 舍入是浮点数概念,定点数无舍入
  • 浮点数舍入的情况:对阶或者右规格化
  • 舍入不一定产生误差(后几位为0时不产生误差)

溢出

  • 尾数右规,阶码上溢,发生溢出异常
  • 尾数左规,阶码下溢,当机器0处理
  • 如果双符号位为01或10时,则溢出【第一个符号是真的符号】
    • 10:正溢
    • 01:负溢
  • 尾数舍入可能引起阶码的上溢
  • 尾数溢出时,结果不一定溢出
    在这里插入图片描述

C强制类型转换

  • 无损:
    • char→int→long→double
    • float→double
  • 有损:
    • int→float【可能会损失精度,float 的尾数数值位只有1+23位】
    • float→int 【可能会溢出,也可能会损失精度,如小数转整数】

浮点数的规格化

  • 规格化:规定尾数的最高数位必须是一个有效值(1)【即,基数为2时,要求尾数: 1 / 2 ≤ ∣ M ∣ < 1 1/2≤|M|<1 1/2M<1
  • 采用规格化浮点数的目的是为了增加数据的表示精度
  • 负数补码的最高数值位是0,就是一个规定,不用纠结为什么
  • 补码表示的最高位与尾数的符号位不同时,表示规格化了
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1591957.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

@AutoConfigurationPackage 和 @ComponentScan 有何区别?

首先&#xff0c;从名字上看&#xff0c;这两个注解意义特别接近&#xff0c;AutoConfigurationPackage 就是自动配置包&#xff0c;自动配置包的目的是能让系统扫描到包内的 Bean&#xff1b;ComponentScan 则是组件扫描&#xff0c;这个松哥在之前的教程中也多次提到过了&…

MYSQL原理学习篇简记(二)

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是小周同志&#xff0c;25届双非校招生Java选手&#xff0c;很高兴认识大家 &#x1f4d5;学习出处&#xff1a;本文是学自小林coding (xiaolincoding.com) 网站的MYSQL图解篇 &#x1f525;如果感觉博主的文章还不错的…

初识SpringMVC(SpringMVC学习笔记一)

1 、还是熟悉的配方&#xff0c;先创建一个父Maven项目&#xff08;忘记怎么创建项目了就去前面翻笔记&#xff09;&#xff0c;导入通用的配置依赖 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instan…

MyBatis核心配置文件介绍使用

文章目录 一、environments二、properties三、typeAliases四、mappers五、创建核心配置文件模板&映射文件模板核心配置文件模板映射文件模板 六、总结 一、environments 核心配置文件中的标签必须按照固定的顺序&#xff1a; properties?,settings?,typeAliases?,typeH…

前端学习<四>JavaScript基础——20-函数简介

函数的介绍 函数&#xff1a;就是一些功能或语句的封装。在需要的时候&#xff0c;通过调用的形式&#xff0c;执行这些语句。 补充&#xff1a; 函数也是一个对象 使用typeof检查一个函数对象时&#xff0c;会返回 function 函数的作用&#xff1a; 一次定义&#xff0c;…

物流自动分拣系统激光雷达漫反射板

早在二十世纪六十年代&#xff0c;激光器的诞生为激光雷达技术的发展奠定了基础。随后&#xff0c;激光雷达技术开始应用于各种领域&#xff0c;包括军事、航空、地理勘测等。然而&#xff0c;在物流自动分拣领域&#xff0c;激光雷达的应用相对较晚。 随着物流行业的快速发展和…

新建Maven工程出现Process Terminated

1、settings.xml文件配置错误&#xff08;方法一&#xff09; 找到我们maven安装路径&#xff0c;在conf文件夹下找到settings.xml文件使用记事本打开 (1) 找到<localRepository></localRepository>标签&#xff0c;查看repository路径是否正确 &#xff08;2&…

AI虽强,搜索引擎仍不可或缺

AI 领域正以前所未有的速度发展&#xff0c;大模型的发布变得愈发频繁&#xff0c;模型的规模也在持续扩大。如今&#xff0c;大模型的起点已经攀升至数十亿参数&#xff08;数十 B&#xff0c;B 是 Billion 的简写&#xff0c;10 亿&#xff09;&#xff0c;其功能之广泛&…

nacos 安装保姆级教程

安装nacos nacosVersion:2.2.3 需要的java版本较高&#xff0c; 所以这里直接安装jdk17&#xff1b; 安装链接见nacos 和jdk 官网&#xff0c;具体选择下面图片中的两个版本哈 本来想直接传到csdn的&#xff0c;结果这边的资料审核还是有点繁琐&#xff0c;然后上传的速度也有点…

【日常记录】【JS】js 实现元素平滑上升

文章目录 1、效果图2、基本骨架3、实现4、完整代码 1、效果图 2、基本骨架 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0&…

测试人员必备:常用自动化测试工具!

Appium 官网&#xff1a;http://appium.io AppUI自动化测试 Appium 是一个移动端自动化测试开源工具&#xff0c;支持iOS 和Android 平台&#xff0c;支持Python、Java 等语言&#xff0c;即同一套Java 或Python 脚本可以同时运行在iOS 和Android平台&#xff0c;Appium 是一…

2.1 LeetCode总结(基本算法)_DFS

1.4 练习 104. 二叉树的最大深度 int maxDepth(struct TreeNode *root, int len) {if (root NULL) {return len;}return fmax(maxDepth(root->left, len1), maxDepth(root->right, len1)); }二叉树最大深度就是基本的递归思路的求解&#xff0c; 手法主要是递归下去之…

React Hooks 全解: 常用 Hooks 及使用场景详解

React Hooks 是 React 16.8 版本引入的一项重要特性,它极大地简化和优化了函数组件的开发过程。 React 中常用的 10 个 Hooks,包括 useState、useEffect、useContext、useReducer、useCallback、useMemo、useRef、useLayoutEffect、useImperativeHandle 和 useDebugValue。这些…

「JS 基础」迭代器和生成器 Iterator Generator 入门

前言 JavaScript的生成器(Generators)和迭代器(Iterators)是ES6引入的功能,使得开发者可以更方便地实现自定义的迭代逻辑。 迭代器 迭代器是一种接口,它为各种不同的数据结构(如数组或者映射)定义了一个标准的遍历方法。具体来说,一个迭代器对象必须实现一个 next…

背包问题详解

前言 本文主要讲解01背包问题&#xff0c;读者如果能完全搞懂01背包&#xff0c;那么稍作思考也能解决完全背包、多重背包问题。至于分组背包、有依赖的背包等问题博主也没有继续深入&#xff0c;但是应该都是在01背包的基础上拓展&#xff0c;读者若有兴趣可查阅其他文章。 …

电源监视继电器HRTH-J-2H2D AC220V 导轨安装 JOSEF约瑟

系列型号&#xff1a; HRTH-Y-2H2D-X-T跳位监视、合位监视、电源监控继电器&#xff1b; HRTH-Y-2Z-X-T跳位监视、合位监视、电源监控继电器&#xff1b; HRTH-Y-2H-X-T跳位监视、合位监视、电源监控继电器&#xff1b; HRTH-J-2H2D-X-T跳位监视、合位监视、电源监控继电器…

Django之rest_framework(一)

一、请求和响应对象介绍 REST framework引入了2个新的对象:Request和Response 1.1、Request rest_framework.request.Request 该对象扩展了常规的HttpRequest ,增加了对REST框架灵活的请求解析和请求认证的支持 官网:Requests - Django REST framework 主要属性: data 这…

react使用npm i @reduxjs/toolkit react-redux

npm i reduxjs/toolkit react-redux 创建一个 store文件夹&#xff0c;里面创建index.js文件和子模块文件夹 index,js文件写入以下代码 import {configureStore} from reduxjs/toolkit // 导入子模块 import counterReducer from ./modules/one import two from ./modules/tw…

计算机网络——CSMA/CD协议以及相关习题

目录 前言 引言 CSMA/CD协议 CSMA与CSMA/CD的区别 CSMA/CD流程 前言 本博客是博主用于复习计算机网络的博客&#xff0c;如果疏忽出现错误&#xff0c;还望各位指正。 引言 最早的以太网&#xff0c;许多计算机都连接在一根总线上工作——广播通信方式。 总线的特点想…

APP开发教学:开发同城O2O外卖跑腿系统源码详解

同城O2O外卖跑腿系统&#xff0c;满足了人们对于外卖送餐和生活服务的需求。今天&#xff0c;小编将为您讲解如何开发同城O2O外卖跑腿系统源码。 1.前期准备 首先&#xff0c;我们需要明确系统的功能需求和用户需求&#xff0c;包括外卖订购、配送员接单、支付功能等。其次&am…