02计算机组成原理-定点数加减法

02计算机组成原理-定点数加减法

1.数据的表示

定点数:是一种表示固定小数位数的数值类型,通常表示为一个有符号的整数部分和一个小数部分。

  • 定点小数:如果是有符号数,约定小数点在符号位的后面,如果是无符号数,约定小数点在最前边。 定点小数的是类似:0.XXXXXX这个形式。例如1.11代表负的0.11,0.11代表正的0.11。一般会在商业技术中应用,比如说去记账,记账一般是会有数据格式的,比如规定数据统一用两位整数和两位小数表示:xx.yy,1.2就要写成01.20。这样小数点就在那个位置不变了。

  • 定点整数:约定小数点在最后边。定点整数是类似:XXXXXX.0这种形式。一般最后的那个0会省略掉。我们之前学过的原码,反码,补码的时候其实都是针对于定点整数的二进制表示法

浮点数:相当于生活中的科学计数法,小数点的位置是可以不断变化的;且小数点位置的变化,不会影响表达式整体数值的大小。IEEE 754是由IEEE制定的有关浮点数的工业标准,被广泛采用。我们后面学小数,浮点数怎么表示其实就是学这个IEEE 754标准。

在计算机中,通常是用定点数来表示整数和纯小数,分别称为定点整数和定点小数。对于既有整数部分、又有小数部分的数,一般用浮点数表示。

2.定点数的加减法运算

定点数我们要看是否带符号。

在计算机中,有符号数一般采用补码表示。重点关注补码运算。

2.1无符号数加减法

2.1.1无符号数加法

因为没有符号,说明是大于等于0的数相加,这个计算的规则和我们的十进制类似,只是十进制是逢十进一,这个地方则是逢二进一。比说11(十进制)+5(十进制)假设这里是固定的4位二进制。

11的四位二进制是1011,5的四位二进制是0101,不断进1后发现我们固定的4位是0000,那这样算出来不就是0吗,11+5肯定不可能为0,问题就出现在固定位数,由于最后的算出来是5位,按照我们之前讲的高位的直接扔掉,保留后4位,这种情况我们称为向上溢出。从这里可以看出,如果不规定位数,最后的结果10000就是16就对了,所以无符号数的加法就跟我们十进制的加法是类似的。相信这里不难理解。

2.1.2无符号数加减法

现在来看一个减法41-26,假设是6位的固定位数,41的二进制是101001,26的二进制是011010,注意位数不够的时候往前面借是借的2,就像十进制位数不够往前面借的是10,转为十进制后001111是15,说明无符号数的减法就跟我们十进制的减法是类似的。相信这里也不难理解。

2.2有符号数加减法

对于原码(符号位不参与运算 ):

加法运算:同号相加,符号位不变,数值位相加。如果是异号相加就当减法处理

减法运算:先判断两个数大小确定结果的符号,绝对值大的减去绝对值小的。如果是异号相加就当加法处理

从这里可以看出原码的加减比较复杂,而且如果把符号位带进去计算会出问题,比如14+(-14),如果代入符号位进去算,如下会出现问题。

对于补码(符号位参与运算 ):

加法运算:补码直接相加

减法运算:被减数的补码+减数相反数的补码。因为5-9=5+(-9)。

2.2.1有符号数加法

来算一个15+(-24),15的补码是00001111,-24的补码是11101000,直接连同符号位相加得11110111,注意这里最终算出来的二进制数11110111数补码形式所对应的原码10001001转换成十进制是-8,和我们十进制算出来的是一样的,没问题。

2.2.1有符号数减法

来算一个15-(-24),15的补码是00001111,-24的补码是11101000,根据我们的补码有符号数运算法则,减一个数等于加上这个数的相反数。已知一个数的补码形式求这个相反数的补码的方法是直接把x的补码连带符号位全部取反+1。例如-24的补码是1110 1000,-24的补码就是0001 1000。最终算出来的二进制数00100111也是补码,最后转换成十进制为39,和我们十进制的运算出来也匹配的上。

在这里补充一个小技巧,已知x的原码,求x的补码,如果这个x是负数的一个情况下,把x原码最右边的一个1前面一直到符号位(不含符号位)直接按位取反。不过还是主要要记住取反+1这个最基础的原理。

3.计算机中加法的实现

首先我们要知道有符号数一般是采用补码形式表示的,那计算机电路肯定也是基于补码的这么一个电路。

加法是一种基本且频繁使用的操作。现代计算机在硬件层面上实现加法操作,通常是通过加法器电路来完成的。加法器会接收两个二进制数作为输入,然后按照二进制加法规则进行逐位相加,同时处理可能出现的进位。

减法,虽然其基本原理与手动计算中的减法相似,但在计算机内部实现时,通常会转换为加法来执行。这是因为计算机内部的电路更擅长执行加法操作,而减法操作可以通过取反和加法的组合来实现。

虽然从原理上看,补码减法是通过取反和加法实现的,但在实际的计算机硬件中,这个过程通常是自动且高效地完成的,无需程序员显式地进行取反和加法的操作。程序员在编写代码时,只需要使用减法运算符(如"-"),然后计算机硬件和操作系统会自动处理底层的细节。

一般情况下,用一个专门的算术逻辑部件(ALU)来完成基本逻辑运算和定点数加减运算,各类定点乘除运算和浮点数运算则可利用加法器或 ALU 和移位器来实现ALU 的核心部件是加法器

算术逻辑单元(Arithmetic Logic Unit,简称ALU)是计算机处理器内部的一个核心组件 ,负责执行基本的算术和逻辑运算。它是一个能够处理二进制数据并进行快速计算的硬件电路块。在功能上,ALU主要包括以下几个方面:

1.算术运算

2.逻辑运算

3.比较运算

4.移位运算

5.其他复合运算

移位运算分逻辑移位和算术移位

在逻辑移位中是无视符号的,统一移动。

算术移位,符号位是不变的,只对数值位进行移动。比如说有有符号数6,固定5位,对其进行算术移位。

这里左移时,末尾补0就行,但是右移的时候,空出来的位置根据符号位来补,而且不用管右移几位,空出来的这几位都是按照符号位来补,符号位是什么就补什么。

加法器是计算机中的一种数位(字)电路,用于执行数字的加法计算。在电子学中,加法器常用于各种数值的表示和计算,特别是在二进制运算中。在计算机和一些处理器中,加法器被运用于算术逻辑单元ALU中,或者处理器的其他部分,如计算地址、执行加减操作等类似功能。因此,加法器是算术逻辑单元中的一个重要部件。

注:具体电路会在后面详细讲解

4.溢出

补码定点数加减溢出:正溢出 负溢出

正数+正数=负数--->正溢出

负数+负数=正数--->负溢出

溢出检测方法:

1.和的符号位与两个加数的符号位不同

比如X+Y=Z,X的符号位是Xs,Y的符号位是Ys,Z的符号位是Zs,问Xs的取值是?

0或1,因为符号位要么就是0要么就是1,如果是正溢出,说明Xs是0,Ys是0,Zs是1,如果是负溢出则说明是Xs是1,Ys是1,Zs是0。

如果现在bool变量V表示1为溢出,0表示没溢出。

那么如果V=(Xs&Ys&(~Zs))||((~Xs)&&(~Ys)&&Zs)(~表示取非,电脑不太好写那个)这个公式就代表如果是001的组合,那||后面就代表1最后得V为1,如果是110就代表||前面那个为1最后得V为1,除去这两种情况V就等于0。

2.最高位和次高位的进位不同-->溢出

8位补码运算【-128~127】 15+124和-24-124,通过十进制运算肯定是会溢出的

0000 1111+ 0111 1100,可以看出最高位和次高位一个进0一个进1是不同的,说明溢出

1110 1000+1000 0100,可以看出最高位和次高位一个进1一个进0是不同的,说明溢出。

总结原理,如果是正数的情况,因为符号位都是0,所以如果溢出,即最高位产生进位,那么一定会是进0,那这个时候就看次高位,如果得到的是0说明没有溢出,如果是1说明符号位从0变为了1,即两个正数相加得到了1,故溢出。负数相加同理。

3.双符号位判别

用两个符号位,例如2的4位二进制位数为0010-->运算的时候复制一个符号位为00010,注意只是运算的时候才是双符号位,但是存储时只存储一位符号位。这里00表示正,11表示负,10,01表示溢出。依旧来看15+124和-24-124这两个例子。

15+124

-24-124

原理其实也是因为进了符号位往上进了一位即溢出了,导致复制出来的符号位不同了。

5.小补充

补充关于负溢出的另一种情况:

两个特别大的正数(比如本来就是溢出的两个数相减)相减或者无符号整数相减




借用豆包举例了。

两个正数相减:在大多数现代计算机系统中,整数运算(包括相减)是在固定宽度的寄存器或内存中进行的,这意味着它们有一个上限和下限。当执行两个正数相减时,如果结果超出了这个范围(即溢出),那么实际存储的值将是一个意外的、通常是错误的值。

为了避免溢出,程序员可以采取以下措施:

检查操作数:在执行减法之前,检查操作数的大小,确保它们不会导致溢出。使用更大的数据类型:如果可能的话,使用更大的数据类型(如 long long 而不是int )来存储结果,以增加可表示的范围。

使用专门的库函数:一些编程语言提供了库函数来处理大整数或进行安全的算术运算,这些函数可以自动处理溢出问题。

异常处理:在可能出现溢出的地方添加异常处理代码,以便在发生溢出时能够优雅地处理错误。

大概先写这些吧,今天的博客就先写到这,谢谢您的观看。

相关推荐
散1124 天前
02计算机组成原理-寻址方式总结
计组
散1128 天前
02计算机组成原理-32位立即数与寻址
计组
散11211 天前
02计算机组成原理-指令格式
计组
散11212 天前
02计算机组成原理-逻辑运算符与字符表示
计组
散11213 天前
02计算机组成原理-有符号数和无符号数
计组
散11216 天前
02计算机组成原理-计算机硬件的操作及操作数
计组
渡我白衣20 天前
【MySQL基础】(1):MySQL的安装
大数据·数据库·人工智能·mysql·算法·计组·数电
散11221 天前
02计算机组成原理-计算机的性能
计组
散11224 天前
02计算机组成原理-计算机硬件组成
计组