定点数的加减法

article/2025/9/27 8:28:21

文章目录

  • 1.补码加法
    • 1.1 补码加法公式
    • 1.2 补码加法公式证明
  • 2.补码减法
  • 3.溢出概念与检测方法
    • 3.1 溢出的概念
    • 3.2 溢出的检测方法
  • 参考文献

数值运算的核心是指加、减、乘、除四则算术。由于计算机中的数有定点和浮点两种表示形式,因此相应有定点数的运算和浮点数的运算。本文将介绍计算机中定点数的加减法运算过程。

注意,理解本文的前提是要清楚知道顶点数的源码、反码和补码的含义,以及定点数在计算机中的表示形式。

1.补码加法

由于计算机中定点数均以补码的方式表示和存储,采用补码表示法进行加减运算比原码方便多了,因为不论是正还是负,机器总是做加法,减法运算可变成加法运算。

这里再次说明定点定点数(定点整数和定点小数)的源码、反码和补码的表示规则:
正数的符号位为0,反码和补码等同于源码。
负数符号位都固定为1,源码,反码和补码的表示都不相同,由原码表示法变成反码和补码有如下规则:
(1)源码符号位为1不变,整数的每一位二进制数位求反得反码;
(2)反码符号位为1不变,反码数值位最低位加1得补码。

1.1 补码加法公式

补码加法公式是:
[ x ] 补 + [ y ] 补 = [ x + y ] 补 ( m o d 2 n ) [x]_补+[y]_补=[x+y]_补 (mod 2^n) [x]+[y]=[x+y](mod2n)
这里说一下上面公式的意思。 m o d 2 n mod 2^n mod2n表示的是模运算, 2 n 2^n 2n为模,这个模表示被丢掉的值。上面的式子在数学上成为为同余式,即等式两边的值取 2 n 2^n 2n的余数是相等的。

以钟表为例,说明模运算。一个钟表有12个小时刻度,时间确实0-24小时。假设现在的标准时间是4点整,而有一个表已经7点了,为了校准时间,可以采用两种方法:一是将时针退7-4=3格;二是将时针向前拨12-3=9格。这两种方法都能对准到4点。由此可见,7-3和7+9是等价的。等价的条件就是以模为12的模运算的情况下等价,即除以12取余。以数学公式表示如下:
7 − 3 = 7 + 9 ( m o d 12 ) 7-3=7+9 (mod12) 73=7+9(mod12)

1.2 补码加法公式证明

可分五种情况来证明。假设采用定点整数表示。不包括溢出情况,该情况会另行讨论。

(1)x>0, y>0, 则x+y>0
由补码定义, [ x ] 补 = x , [ y ] 补 = y [x]_补=x, [y]_补=y [x]=x,[y]=y, 所以 [ x ] 补 + [ y ] 补 = x + y = [ x + y ] 补 [x]_补+[y]_补=x+y=[x+y]_补 [x]+[y]=x+y=[x+y]

(2)x<0, y<0, 则(x+y)<0
[ x ] 补 + [ y ] 补 = 2 n + x + 2 n + y = 2 n + ( 2 n + x + y ) = [ x + y ] 补 [x]_补+[y]_补=2^n+x+2^n+y=2^n+(2^n+x+y)=[x+y]_补 [x]+[y]=2n+x+2n+y=2n+(2n+x+y)=[x+y]

(3)x>0, y<0, 则(x+y)<0或(x+y)>0
相加的两数一个为正,一个为负,因此相加结果有正、负两种可能。根据补码定义: [ x ] 补 = x , [ y ] 补 = 2 n + y [x]_补=x, [y]_补=2^n+y [x]=x,[y]=2n+y,那么
[ x ] 补 + [ y ] 补 = x + 2 n + y = 2 n + ( x + y ) = [ x + y ] 补 [x]_补+[y]_补=x+2^n+y=2^n+(x+y)=[x+y]_补 [x]+[y]=x+2n+y=2n+(x+y)=[x+y]

(4)x<0, y>0, 则(x+y)<0或(x+y)>0
这种情况和第三种情况一样,将x和y对调即可,不再赘述。

(5)当x=0或者y=0,或者x=y=0时
满足 [ x ] 补 + [ y ] 补 = [ x + y ] 补 ( m o d 2 n ) [x]_补+[y]_补=[x+y]_补 (mod 2^n) [x]+[y]=[x+y](mod2n)

因此在模 2 n 2^n 2n的意义下,任意两数的补码之和等于该两数之和的补码。这是补码加法的理论基础。

2.补码减法

负数的加法要利用补码化为加法来做,减法运算当然也要设法化为加法来做。其所以使用这种方法而不适用直接减法,是因为它可以和常规的加法运算使用同一加法器电路,从而简化了计算机的设计。

定点数用补码表示时,减法运算的公式为:
[ x ] 补 − [ y ] 补 = [ x ] 补 + [ − y ] 补 [x]_补-[y]_补=[x]_补+[-y]_补 [x][y]=[x]+[y]

为了证明这个公式,只要证明 [ − y ] 补 = − [ y ] 补 [-y]_补=-[y]_补 [y]=[y],上式即得证。

证明如下:
因为 [ x ] 补 + [ y ] 补 = [ x + y ] 补 [x]_补+[y]_补=[x+y]_补 [x]+[y]=[x+y],所以
①$ [y]_补= [x+y]_补–[x]_补$

[ x – y ] 补 = [ x + ( – y ) ] 补 = [ x ] 补 + [ – y ] 补 [x–y]_补= [x+(–y)]_补= [x]_补+[–y]_补 [xy]=[x+(y]=[x]+[y],所以
[ – y ] 补 = [ x – y ] 补 – [ x ] 补 [–y]_补= [x – y]_补–[x]_补 [y]=[xy][x]

①+②得 [ – y ] 补 + [ y ] 补 = [ x – y ] 补 – [ x ] 补 + [ x + y ] 补 – [ x ] 补 = [ x – y ] 补 + [ x + y ] 补 – [ x ] 补 – [ x ] 补 = [ x – y + x + y ] 补 – [ x ] 补 – [ x ] 补 = [ 2 x ] 补 – 2 [ x ] 补 = 0 [–y]_补+[y]_补= [x–y]_补–[x]_补+[x+y]_补–[x]_补=[x–y]补+[x+y]补–[x]补–[x]补=[x–y+x+y]补–[x]补–[x]补 =[2x]补–2[x]补=0 [y]+[y]=[xy][x]+[x+y][x]=[xy]+[x+y][x][x]=[xy+x+y][x][x]=[2x]2[x]=0

从而有 [ – y ] 补 = – [ y ] 补 ( m o d 2 n ) [–y]补= –[y]补 (mod 2^n) [y]=[y](mod2n)

因此,只要求得 [ – y ] 补 [–y]_补 [y],就可以变减法为加法,已知 [ y ] 补 [y]_补 [y],求 [ – y ] 补 [–y]_补 [y]的法则是:

[ y ] 补 [y]_补 [y]各位(包括符号位)取反,然后在末位加上1,就可以得到 [ – y ] 补 [–y]_补 [y]

示例:
[ X ] 补 = 00110110 , [ Y ] 补 = 11001101 [X ]_补=00110110,[Y]_补 =11001101 [X]=00110110[Y]=11001101,求 [ X ] 补 + [ Y ] 补 , [ X ] 补 − [ Y ] 补 [X]_补+[Y]_补,[X]_补-[Y]_补 [X]+[Y][X][Y] ,其中x=54,y=-51。
这里写图片描述

3.溢出概念与检测方法

3.1 溢出的概念

在定点整数机器中,数的表示范围 ∣ x ∣ < ( 2 n − 1 ) |x|<(2^n-1) x<(2n1)。在运算过程中如出现大于字长绝对值的现象,称为“溢出”。在定点机器中,正常情况下溢出是不允许的。

例:设定点整数字长8位,补码表示(最高位为符号位),表示范围为-128~127,运算结果超出此范围就发生溢出。

两个负数相加的结果小于机器所能表示的最小负数,结果变为负数,成为负溢

两个正数相加,结果大于机器字长所能表示的最大正数,结果成为变为负数,称为正溢

下面以具体的例子来演示正常的运算和溢出时的运算。
这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

3.2 溢出的检测方法

为了判断溢出是否发生可采用以下两种检测方法。

(1)单符号法
当两个操作数同号时,而其和的符号与操作数的符号不一致则就发出溢出,公式表示如下:
溢 出 = A ‾ n B ‾ n S n + A n B n S ‾ n 溢出=\overline A_n\overline B_n S_n +A_n B_n\overline S_n =AnBnSn+AnBnSn

注意:
a、若是同号相减或异号相加,则运算结果不可能溢出;
b、若是同号相加或异号相减,则运算结果可能溢出。

(2)采用最高有效位的进位判断
溢 出 = C ‾ n C n − 1 + C n C ‾ n − 1 = C ‾ n ⨁ C ‾ n − 1 溢出= \overline C_nC_{n-1} + C_n\overline C_{n-1}=\overline C_n\bigoplus \overline C_{n-1} =CnCn1+CnCn1=CnCn1

符号位产生的进位与最高有效位产生的进位情况不同,则溢出。

(3)采用变形补码判断(双符号位)
S n + 1 、 S n S_{n+1}、Sn Sn+1Sn分别表示结果最高符号位和第2个符号位。
溢 出 = S n + 1 ⨁ S n 溢出=S_{n+1}\bigoplus S_n =Sn+1Sn
01:结果正溢;
10:结果负溢;

定点整数的加减运算完成之后,会由硬件逻辑电路进行溢出检测,如果发现存在溢出,则产生硬件中断 。

#4.定点小数的加减运算法则
定点小数是定点数的一种,其运算法则和步骤与定点整数一致,不再赘述。下面举个仅以双符号位补码来表示定点小数的补码加减运算示例。

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述


参考文献

[1] 计算机组成原理第四版[M].白中英.科学出版社
[2] 百度文库.定点数加减法


http://chatgpt.dhexx.cn/article/3kyWOK5b.shtml

相关文章

定点数类型

正因为用浮点数表示小数可能会有不精确的情况&#xff0c;在一些情况下我们必须保证小数是精确的&#xff0c;所以设计MySQL的大叔们提出一种称之为定点数的数据类型&#xff0c;它也是存储小数的一种方式&#xff1a; 其中&#xff1a; M表示该小数最多需要的十进制有效数字个…

定点数的表示

计算机中常用的数据表示格式有两种&#xff0c;一是定点格式&#xff0c;二是浮点格式。所谓定点数和浮点数&#xff0c;是指在计算机中一个数的小数点的位置是固定的还是浮动的&#xff1a;如果一个数中小数点的位置是固定的&#xff0c;则为定点数&#xff1b;如果一个数中小…

定点数运算

reference: http://wenku.baidu.com/link?urlnUzHmqrtKkQ4fOfUb2SW7hBEGS47wlJEw1DS6uW3U3onryAWk-XWlkLHwd3tKbxhoFYDzeDEd3cjYr5ww-MKgpTP_lNYLkjwpXuatw11ply 原补码关系,参考&#xff1a;http://blog.csdn.net/limanjihe/article/details/52440638 补码的设计目的:   …

定点数的表示方法

文章目录 1.定点数的表示形式2.定点数的原码、反码与补码3.定点小数注意事项参考文献 计算机中数值的表示有两种形式&#xff0c;一是定点数&#xff08;Fixed-point Number&#xff09;&#xff0c;二是浮点数&#xff08;Floating-point Number&#xff09;。 1.定点数的表示…

定点数(fixed-point number)的运算

定点数的运算 1. 定点数2. 定点数加减运算3. 定点数加减运算的溢出判断3.1 用一位符号位判断溢出3.2 用两位符号位判断溢出3.3 最高位和次高位判断溢出 4. 乘法运算4.1 分析笔算乘法4.2 笔算乘法的改进4.3 图示4.4 硬件配置4.5 表格示意图 5. 除法运算5.1 分析笔算除法5.2 笔算…

[计算机组成原理]2-4、定点数详解

定点数详解 看笔记一定要心静&#xff0c;慢慢来不急。 定点数解释为小数点固定的数。 我们平常使用的数字大部分都属于定点数。比如1.0&#xff1b;110&#xff1b;192.168等等。这么说可能我们对定点数还是没有什么概念&#xff0c;毕竟没有参照物&#xff0c;那么与定点数…

Java枚举类实现

一、枚举类的特点 1.类的对象只有有限个&#xff0c;且为静态常量 2.当需要定义一组常量时&#xff0c;强烈建议使用枚举类 二、如何定义枚举类 jdk1.5之前&#xff1a;自定义枚举类 jdk1.5 :可以使用enum关键字来定义枚举类 2.1自定义枚举类实现&#xff1a; package enumte…

java枚举

为什么需要枚举&#xff1f; 一些方法在运行时&#xff0c;它需要的数据不能是任意的&#xff0c;而必须是一定范围内的值&#xff0c;比如成绩Grade只能为ABCDE。此类问题在JDK5以前采用自定义带有枚举功能的类解决&#xff0c;Java5以后可以直接使用枚举予以解决。枚举…

Java枚举中定义属性

文章目录 1、复习枚举2、自定义属性3、自定义属性枚举类和常量的对比4、常用方法5、枚举自定义属性在开发中的应用&#xff1a;字典表6、补充&#xff1a;入参校验 刚接触枚举时的例子太简单&#xff0c;就一个Season枚举类&#xff0c;里面四个常量值&#xff0c;后来开发中看…

Java 枚举(Enum)使用

文章目录 枚举引入enum关键字实现枚举enum关键字实现枚举注意事项enum常用方法一览表enum课堂练习enum实现接口 枚举引入 创建Season类, 实例化春夏秋冬四个实例 Season对象有如下特点 1.季节的值是有限的几个值(spring, summer, autumn, winter) 2.只读&#xff0c;不需要修…

Java枚举详解

目录 Java枚举详解 基本介绍 1.自定义类实现枚举 2.使用enum关键字实现枚举 使用enum关键字实现枚举的注意事项 enum的常用方法 enum的使用细节 Java枚举详解 基本介绍 枚举对应英文(enumeration,简写 enum) 枚举是一组常量的集合 枚举属于一种特殊的类&#xff0c;里…

Java枚举(enum)

枚举是一个被命名的整型常数的集合&#xff0c;用于声明一组带标识符的常数。枚举在曰常生活中很常见&#xff0c;例如一个人的性别只能是“男”或者“女”&#xff0c;一周的星期只能是 7 天中的一个等。类似这种当一个变量有几种固定可能的取值时&#xff0c;就可以将它定义为…

如何使用pFuzz以多种方法验证Web应用程序防火墙的安全性

关于pFuzz pFuzz是一款功能强大的Web应用程序防火墙安全检测/绕过工具&#xff0c;可以帮助广大研究人员同时通过多种方式绕过目标Web应用程序防火墙&#xff0c;以测试WAF的安全性。 pFuzz本质上是一款高级红队模糊测试工具&#xff0c;主要用于研究目的。pFuzz基于Python编…

jieba java_【NLP】【一】中文分词之jieba

声明&#xff1a;本文参考jieba官方文档而成&#xff0c;官方链接&#xff1a;https://github.com/fxsjy/jieba 【一】jieba安装 pip install jieba 【二】jieba简介 简介可见jieba官方说明&#xff1a;https://pypi.org/project/jieba/ 总而言之&#xff0c;jieba用于中文分词…

jieba 分词

一.介绍&#xff1a; jieba: “结巴”中文分词&#xff1a;做最好的 Python 中文分词组件 “Jieba” (Chinese for “to stutter”) Chinese text segmentation: built to be the best Python Chinese word segmentation module. 完整文档见 : GitHub: https://github.com…

jieba学习

Jieba jieba的安装主要功能1.主要有三种模式&#xff1a;2. 加载词典3.词性标注4.关键词提取5.Tokenize&#xff1a;返回词语在原文的起止位置 jieba的安装 先在 [http://pypi.python.org/pypi/jieba/]下载 &#xff0c;解压后运行 python setup.py install 或者pin install j…

jieba 结巴分词详解

&#x1f517; 运行环境&#xff1a;python3&#x1f6a9; 作者&#xff1a;K同学啊&#x1f947; 精选专栏&#xff1a;《深度学习100例》&#x1f525; 推荐专栏&#xff1a;《新手入门深度学习》&#x1f4da; 极品专栏&#xff1a;《Matplotlib教程》&#x1f4d4; 选自专栏…

NLP基本工具之jieba详解

jieba的作用只有分词吗&#xff1f; 简介 jieba&#xff08;结巴&#xff09;是百度工程师Sun Junyi开发的一个开源库&#xff0c;在GitHub上很受欢迎&#xff0c;使用频率也很高。 GitHub链接&#xff1a;https://github.com/fxsjy/jieba jieba最流行的应用是分词&#xff0…

jieba分词的最详细解读

目录 一&#xff0c;什么是jieba&#xff08;结巴&#xff09;库&#xff1f; 二&#xff0c;jieba库的使用规则 三&#xff0c;jieba库具体使用和实例 一&#xff0c;什么是jieba&#xff08;结巴&#xff09;库&#xff1f; 字如其名&#xff0c;结巴库主要用于中文分词&…

python中jieba库使用教程

jieba是python的一个中文分词库&#xff0c;下面介绍它的使用方法。 安装 方式1&#xff1a; pip install jieba方式2&#xff1a; 先下载 http://pypi.python.org/pypi/jieba/ 然后解压&#xff0c;运行 python setup.py install 功能 下面介绍下jieba的主要功能&#xff…