首页 > 其他分享 >第2章 数据的表示和运算

第2章 数据的表示和运算

时间:2024-08-23 10:39:25浏览次数:10  
标签:表示 右移 0000 运算 符号 补码 寄存器 数据

概述


数制与编码

  • 进位计数制及其相互转换;定点数的编码表示

运算方法和运算电路

  • 基本运算部件:加法器;算术逻辑单元(ALU)
  • 加减运算:补码加/减运算器;标志位的生成
  • 乘/除运算:乘/除法运算的基本原理;乘法电路和除法电路的基本结构

数制与编码

进位计数制及其相互转换


采用二进制编码的原因

  1. 二进制只有两种状态,使用有两个稳定状态的物理器件就可以表示二进制数的每一位,制造成本比较低。
  2. 二进制位1和0正好与逻辑值“真”和“假”相对应,为计算机实现逻辑运算和程序中的逻辑判断提供了便利条件。
  3. 二进制编码和运算规则都很简单,通过逻辑门电路能方便地实现算术运算。

进位计数法

  1. 计算机通常使用二进制数八进制数十六进制数

  2. 进位计数法中,每个数位所用到的不同数码的个数称为基数。每个数码所表示的数值等于该数码本身乘以一个与它所在数位有关的常数,这个常数称为位权

  3. 一个r进制数$ K_nK_{n-1}\dots K_0K_{-1}\dots K_{-m}$的数值可以表示为:

\[K_nr^n+K_{n-1}r^{n-1}+\cdots+K_0r^0+K_{-1}r^{-1}+\cdots+K_{im}r^{-m}=\sum^{-m}_{i=n}K_ir^i \]

  1. 可以用后缀字母标识一个数的进位计数制,用B表示二进制,用O表示八进制,用D表示十进制(通常省略),用H表示十六进制,有时也用前缀0x表示十六进制数。
109=109D=1101101B=155O=5CH=0x5C

进制转换
将十进制数123.6875转换成二进制数

  • 整数部分采用除基取余法
    description

  • 小数部分采用乘基取整法
    description

定点数的编码表示


真值和机器数

  1. 真值:数据在逻辑上或数学上的实际值。
  2. 机器数:计算机内部存储和处理的数值。

机器数的定点表示

  1. 根据小数点的位置是否固定,将数据格式区分为:定点表示浮点表示
  2. 浮点表示:用补码整数表示整数,用原码小数表示浮点数的尾数部分,用移码表示浮点数的阶码部分。
  3. 定点小数:定点小数是纯小数,约定小数点位置在符号位之后、有效数值部分最高位之前。
  4. 浮点小数:定点整数是纯整数,约定小数点位置在有效数值部分最低位之后。
  5. 定点数的编码表示法有四种:原码、补码、反码和移码。
    description

原码
用机器数的最高位表示数的符号,其余各位表示数的绝对值。

+0111->0 0000111
-1011->1 0001011

反码
正数的反码与原码相同,对于负数的反码,符号位保持不变,而数值位则按位取反。

+1011->0 0001011
-1011->1 1110100

补码
正数的补码和原码相同,负数的补码等于模\(2^{n+1}\)与绝对值之差,其中n为尾数位数。
description

也可以采用“各位取反,末位+1”的方法得到
description

机器数BAH为补码,其表示的数值为多少?
BAH = 1011 1010B
符号:-
数值:011 1010-1=011 1001--取反--> 100 0110 = 70
故表示-70

移码
移码场用来表示浮点数的阶码。移码是在真值\(X\)上加上一个常数(偏置值),通常这个常数取\(2^n\)

+1011 -> 10001011
-1011 -> 01110101

同一个数的反码、移码的数值位相同,符号位相反

无符号整数
当一个编码的全部二进制位均为数值位,而没有符号位时,该编码表示就是无符号整数,简称无符号数

C语言中的整数类型及类型转换


C语言规定了如下类型:

  • 字符型char:8位/1字节
  • 短整型short: 16位/2字节
  • 整型int:32位/4字节
  • 长整型long:在32位机器中为32位,64位机器中为64位

char默认是无符号整数,short/int/double默认是有符合整数

强制类型转换

在有符号整型和无符号整型的强制类型转换时,位值保持不变,仅改变了解释值的方式。
description

不同字长整数之间的转换

长->短:当长字长变量向短字长变量强制类型转换时,数值位的高位部分直接截断。
短->长:当短字长变量向长字长变量强制类型转换时,数值位的高位部分补0。

运算方法和运算电路

基本运算部件


基本运算部件

  1. 运算器组成:运算器由算术逻辑单元(ALU)移位器状态寄存器(PSW)通用寄存器等组成。
  2. 运算器的基本功能包括四则运算、逻辑运算、移位、求补等。
  3. ALU的核心部件是加法器。

全加器及其工作原理

全加器:全加器是一种用于二进制加法的基本电路元件。它的主要功能是对两个二进制数位以及一个进位输入进行加法运算。
全加器有三个输入:A加数、B加数、C来自前一位的进位输入。
全加器有两个输出:F和,加法结果的当前位;Cout进位输出,向下一位进位的值。

全加器输入和输出逻辑关系如下:

  • F和:\(F=A\oplus B \oplus C_{in}\)

简单理解:保留计算结果的最低位。
1+1+0=10 -> F=0

  • Cout进位输出:\(C_{out}=(A\land B)\lor(A\land C_{in})\lor(B\land C_{in})\)

简单理解:A、B、Cin只要有任意两个是1,则Cout为1。
A=1, B=1, Cin=1 -> Cout=1

description

带标志加法器

为了能进行有符号整数的加/减运算,需要在无符号加法器的基础上增加相应的逻辑门电路,使得加法器不仅能计算和/差,还要能生成相应的标志信息。

description

图:带标志加法器符号

标志信息的逻辑表达式如下:

  • 溢出标志OF:\(OF=C_n \oplus C_{n-1}\)
  • 符号标志SF:\(SF=F_{n-1}\)
  • 零标志ZF:\(ZF=0\)当且仅当\(F=0\)
  • 进位/借位标志CF:\(CF=C_{out}\oplus C_{in}\)
description

图:带标志加法器的逻辑电路

算术逻辑单元(ALU)

ALU是一种功能较强的组合逻辑电路,它能进行多种算术运算和逻辑运算。由于加、减、乘、除运算都能归结为加法运算,因此ALU的核心是带标志加法器。

ALUop是操作控制端,用来决定ALU所执行的处理功能。ALUop的位数决定了操作的种类。

description

在ALUop的控制下,由一个多路选择器(MUX)选择输出三种操作结果之一。

description

图:一位ALU的结构

定点数的移位运算


根据操作数的类型不同,移位运算可以分为逻辑移位和算术移位

逻辑移位

  • 逻辑移位将操作数视为无符号整数。
  • 规则:左移时,高位移出,低位补0;右移时,低位移出,高位补0。
左移:1011->0110
右移:1011->0101

位移如何判断是否有溢出?
左移:左移前后符号位相同则没有溢出,反之有溢出;
右移:右移不会发生溢出。

算术移位

计算机中的有符号整数都是用补码表示的,因此对于有符号整数的移位操作应采用补码算术移位方式。
左移:数值位最高位移至符号位,其余为左移,最低位补零。
右移:数值位右移,最高位补符号位。
description

定点数的加减运算


补码的加减法运算
补码运算规则如下:

  1. 按二进制运算规则运算。
  2. 若做加法,两个数的补码直接相加;若做减法,则将被减数与减数的负数补码相加。
  3. 符号位与数值位一起参与运算,加、减运算结果的符号位也在运算结果中直接得出
  4. 运算结果亦为补码。
    description
    图:补码加减法运算示意

溢出判别方式
设\(A\)的符号是\(A_S\),B的符号是\(B_S\),运算结果的符号是\(S_S\),则溢出逻辑表达式是:

\[V=A_SB_S\overline{S_S}+\overline{A_S}\overline{B_S}S_S \]

若V=0,表示无溢出;若V=1表示有溢出。

有两种溢出情况:输入均正输出为负;输入均负输出正。

加减运算电路设计

分析下图的运算组件。
当Sub为0时,加法器计算\(X+Y\)。
当Sub为1时,加法器计算\(X+\overline{Y}+1\),相当于计算\(X-Y\)。

description

定点数的乘除运算


原码乘法
原码乘法运算分为两步:

  1. 符号:乘积的符号位由两个乘数的符号位“异或”得到。
  2. 数值:乘积的数值位是两个乘数的绝对值之积。
description

乘法运算电路

这里讨论32位无符号数乘法,其流程如下:

  1. 乘积寄存器初始置0。
  2. 将被乘数放在乘数寄存器X中,乘数存放在乘积寄存器Y中。
  3. 计数器\(C_n\)赋初值32,每循环一次减1。
  4. 对进位位C、寄存器P和寄存器Y实现同步“逻辑右移”,此时进位位C移入寄存器P的最高位,寄存器Y的最低位移出。
  5. 将乘积寄存器Y移出的最低位送至控制逻辑,以决定被乘数是否“加”到部分积上。
  6. 对乘积寄存器P和被乘数寄存器X的内容做无符号加法运算,结果送回寄存器P,进位存放在C中。
    7.. 跳转至3.
description

图:32位无符号数乘法的运算的逻辑结构图

为便于理解,以8位无符号数为例:

计算 1101 0111 * 0010 1101

1 置零Cn=0,C=0,P|Y = 0000 0000 0000 0000,X = 0000 0000
2 输入Cn=0,C=0,P|Y = 0000 0000 0010 1101,X = 1101 0111
3 初始化Cn=8,C=0,P|Y = 0000 0000 0010 1101,X = 1101 0111
4 右移P|Y = 0000 0000 0001 0110,移出1
5 移出为1,故做加法
6 P=0000 0000 X =1101 0111,结果F=1101 0111,C=0
  P|Y = 1101 0111 0001 0110
3 Cn=7
4 右移P|Y = 0110 1011 1000 1011,移出0
5 移出为0,不做加法,跳过⑥
3 Cn = 6
4 右移P|Y = 0011 0101 1100 0101,移出1
5 移出为1,做加法
6 P=0011 0101 X=1101 0111,结果F=0000 1100,C=1
  P|Y  = 0000 1100 0001 0110
3 Cn = 5
4 右移 P|Y = 1000 0110 0000 1011,移出0
...

除法运算

除法运算的过程可归纳为:

  1. 被除数与除数相减,够减则上商1,不够减则上商0。
  2. 差为中间余数,将除数右移继续比较。
description

除法运算电路

  1. 将除数存在寄存器Y中
  2. 将被除数的高32位存在寄存器R中;将被除数的低32位存在寄存器Q中
  3. 计数器\(C_n\)赋初值32,每循环一次减1
  4. ALU对寄存器R和寄存器Y内容做加/减法运算,运算结果送回寄存器R
  5. 对寄存器R、Q同步左移,Q最高位移入R的最低位,Q空出的最低位被上商
  6. 控制逻辑根据ALU运算结果的符号来决定上商是0还是1

32位int整数相除只有 \(-2^{31}/-1\)会溢出

description

下篇预告

下篇我们将分享整数的表示和运算浮点数的表示和运算两个板块的知识点。

制作不意,请帮我点一个免费的赞,谢谢!

标签:表示,右移,0000,运算,符号,补码,寄存器,数据
From: https://www.cnblogs.com/SXWisON/p/18371411

相关文章

  • 【数据结构】【模板】笛卡尔树
    笛卡尔树定义笛卡尔树每个节点有两种属性,一种是键值,一种是优先级。一般将位置作为键值,维护BST的性质,这样其中序遍历一定为\(1~n\)。一般将数值看作优先级,维护堆的性质。构建思路维护一个单调栈,表示现在的右链长度。我们将数组从前往后插入笛卡尔树。对于第\(i\)个......
  • 利用ibd2sql直接读取mysql8数据文件数据
    MySQL8.0之后,表结构和表数据统一放到了ibd文件中,该文件包含了表的结构和索引以及数据信息。MySQL支持利用ibd2sdi来进行解析ibd文件下载地址:https://github.com/ddcw/ibd2sql/archive/refs/tags/v1.5.tar.gz[[email protected]]#ibd2sdi/data/mysqldata/data/test01/t......
  • .net使用Freesql连接瀚高数据库
    默认情况下Freesql可以使用PostgreSQL的连接方式连接,如果是md5加密的varisdatabase=MyRedis.GetStringKey("DataBaseType");varsqlConnStr="Server=192.168.1.111;Port=5866;UserId=root;Password=123456;Database=databasename;searchpath=moshi";FreeSql.D......
  • 编程创建一个Cale计算类,在其中定义2个变量表示两个操作数,定义四个方法实现求和、差、
    1publicclassHomework06{2//编写一个main方法3publicstaticvoidmain(String[]args){45Calecale=newCale(2,10);6System.out.println("和="+cale.sum());7System.out.println("差="+cale.minus());......
  • 运算论
    运算论优先级考虑变换优先级:线性变换(加减乘除)>非线性可逆变换(次幂)>不可逆有结合律变换(最值:max、min、gcd、lcm)>无结合律变换(求众数、中位数)量规避去max、min、gcd、lcm等不可逆变换,而将其转换为加减乘除等变换范围关系将一大部分进行操作可以转换为全局操作加上对另一小部分......
  • Python-批量统计MySQL中表的数据量
    背景在数据中台中,有时为了核对数据,需要每天批量统计MySQL数据库中表的数据量,但是DMS中没有周期调度功能。MySQL创建表--统计的表清单CREATETABLE`dws_table_list`(`table_name`varchar(255)DEFAULTNULL,`flag`varchar(255)DEFAULTNULL);--每天的数据量CRE......
  • 得帆中台数据中spark sql和hive sql的效率差异记录
    在数据处理方面,sparksql的处理速度优于hivesql场景1:在数据条数为491条时,使用sparksql和hivesql在中台处理的时间,分别用时9s和55s//使用的SQL语句SELECTYEAR(update_time)ASyear,month(update_time)asmonthFROMdwd_tb_customer_store_appraiseWHEREYEAR(......
  • <数据集>考场行为识别数据集<目标检测>
    数据集格式:VOC+YOLO格式图片数量:2192张标注数量(xml文件个数):2192标注数量(txt文件个数):2192标注类别数:2标注类别名称:['cheating','good']序号类别名称图片数框数1cheating128214412good10671261使用标注工具:labelImg标注规则:对类别进行画水平矩形框图片示例:标注......
  • 学习分享:如何学习 API 中的数据格式
    以下是学习API中数据格式的要点:一、了解常见数据格式JSON(JavaScriptObjectNotation):结构特点:它是一种轻量级的数据交换格式,易于人阅读和编写,也易于机器解析和生成。JSON数据格式由键值对组成,类似于Python中的字典或者JavaScript中的对象。例如:{"name":"John",......
  • 慢 SQL 是如何拖垮数据库的?
    案发现场上午9:49,应用报警:错误码4103.ERR_ATOM_CONNECTION_POOL_FULL,提示数据库连接池已满。在上午9:49至10:08的这段时间内,又陆续接收到了多个数据库异常报警,包括4200.ERR_GROUP_NOT_AVAILABLE、4201.ERR_GROUP_NO_ATOM_AVAILABLE以及4202.ERR_SQL_QUERY_TIMEOUT等。鉴于数据......