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

文章目录

  • 大纲
    • 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.hqwc.cn/news/624047.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【电控笔记6.2】拉式转换与转移函数

概要 laplace&#xff1a;单输入单输出&#xff0c;线性系统 laplace 传递函数 总结

使用Python模仿文件行为

在Python中&#xff0c;你可以通过文件操作函数&#xff08;如open()函数&#xff09;以及模拟输入输出流的库&#xff08;如io模块&#xff09;来模拟文件行为。下面是一些示例&#xff0c;展示了如何使用这些工具在Python中模拟文件行为。 1、问题背景 在编写一个脚本时&…

MSQL DML数据操作语言

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; 往期热门专栏回顾 专栏…

随机游走的艺术-图嵌入表示学习

图嵌入引入 机器学习算法&#xff1a; 厨师 样本集&#xff1a; 食材 只有好的食材才能做出好的饭菜 我们需要把数据变成计算机能够读懂的形式&#xff08;将数据映射成为向量&#xff09; 图嵌入概述 传统图机器学习 图表示学习 自动学习特征&#xff0c;将…

【Altium Designer 20 笔记】PCB铺铜过程

PCB铺铜步骤 切换到Keep-Out Layer&#xff08;禁止布线层&#xff09; 使用shifts键切换单层显示 画禁止布线范围&#xff08;防止铺铜过大&#xff09; 切换到需要铺铜的层 选择铺铜网络&#xff0c;通常是地&#xff08;GND&#xff09;或某个电源网络 隐藏覆铜&#xff1a;…

leetcode:42.接雨水

单调栈解题思路&#xff1a; 需要知道当前遍历到的元素左边和右边第一个比该元素大的元素。 如果当前遍历到的元素大于栈顶元素&#xff0c;则该元素为栈顶元素右边第一个比它大的元素&#xff0c;此时&#xff0c;栈顶元素的栈内相邻元素是该元素左边第一个比它大的元素。【…

Python 入门指南(一)

原文&#xff1a;zh.annas-archive.org/md5/97bc15629f1b51a0671040c56db61b92 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 前言 这个学习路径帮助你在 Python 的世界中感到舒适。它从对 Python 的全面和实用的介绍开始。你将很快开始在学习路径的第一部分编写程序…

上海人工智能实验室的书生·浦语大模型学习笔记(第二期第四课——上篇)

书生浦语是上海人工智能实验室和商汤科技联合研发的一款大模型&#xff0c;这次有机会参与试用&#xff0c;特记录每日学习情况。 今天就ddl&#xff0c;但这次学习的内容太多&#xff0c;需要很长时间去消化&#xff0c;要抓紧最后时间&#xff0c;不然来不及了 这次记录的是…

02_对象树

#include "mypushbutton.h" #include <QDebug>MyPushButton::MyPushButton(QWidget *parent): QPushButton(parent) {qDebug()<<"我的按钮类构造调用"; }MyPushButton::~MyPushButton() {qDebug()<<"我的按钮类析构调用"; }交…

蓝桥杯2024年第十五届省赛真题-R 格式(高精度乘法 + 加法)

本题链接&#xff1a;蓝桥杯2024年第十五届省赛真题-R 格式 - C语言网 题目&#xff1a;​​​​​​​ 样例&#xff1a; 输入 2 3.14 输出 13 思路&#xff1a; 根据题意&#xff0c;结合数据范围&#xff0c;这是一道模板的高精度乘以低精度问题。 题意是double 类型 d 与…

【C++】类和对象③(类的默认成员函数:拷贝构造函数 | 赋值运算符重载)

&#x1f525;个人主页&#xff1a;Forcible Bug Maker &#x1f525;专栏&#xff1a;C 目录 前言 拷贝构造函数 概念 拷贝构造函数的特性及用法 赋值运算符重载 运算符重载 赋值运算符重载 结语 前言 本篇主要内容&#xff1a;类的6个默认成员函数中的拷贝构造函数…

大数据快速搭建环境 CDH QuickStart VM虚拟机版本安装

虚拟机镜像安装 下载 https://downloads.cloudera.com/demo_vm/vmware/cloudera-quickstart-vm-5.8.0-0-vmware.zip https://downloads.cloudera.com/demo_vm/vmware/cloudera-quickstart-vm-5.12.0-0-vmware.zip https://downloads.cloudera.com/demo_vm/vmware/cloudera-…