在现代计算机中,补码主要用来表示整数(数值整数),CPU在补码的基础上实现加法运算,减法也通过加法来实现(Intel x86的CPU中,都有加法器和乘法器,用加法器实现减法,用乘法器实现除法;当然,某些高级CPU还可能会有更先进的计算部件,一个指令直接进行\(\sin\)和\(\cos\)等计算)。本文总结补码相关知识。

先说说模运算(mod):

模可以理解为一个正数,一个上界。在模运算系统中,若A,B,M满足这个关系:\(A=B+K \times M\),K为整数,则记为:\(A \equiv B \pmod M\)。即A,B各除以M后的余数相同,故称B和A为模M同余。也就是说在一个模运算系统中,一个数与它除以模后得到的余数是等价的(这里没有考虑负数)。时钟系统,就是最典型的模运算系统,模是12或24。

补码跟模运算啥关系:

假设现在钟表时间是10点,要将它拨到6点,有两种拨法:

1, 倒拨4个小时;

2, 顺拨8个小时;

所以,在模12系统中,\(10-4 \pmod {12} \equiv 10+8 \pmod {12}\)

上式也可以写为:\(-4 \equiv 8 \pmod {12}\)

于是,我们可以说,8是-4对模12的补码。

结论:对于某一个确定的模,某数A减去小于模的另一个数B,可以用A加上(-B)的补码来代替!

这就是为什么补码可以借助加法运算实现减法运算的道理。

补码的定义

1, 正数的补码就是它本身;

2, 负数的补码等于模与该负数绝对值之差。

(如果计算之后还是负数,继续迭代,比如:\(-7 \pmod 3 \equiv 2\))

因此,某一个数的补码,不管它是正是负,其补码都是正数!

在计算机中,一般情况下,一个整数由\(n=32\)bit位来表示,正好有符号整数在现代计算机中基本都使用补码来表示。对于有符号的整数,第一位是符号位,那么,有符号整数的模就是\(2^n\)。(n-1个bit的有效数据,模就是2的n次方)

我们定义:

1, 对于n为有符号整数定点整数(小数点在最右边),补码为:

\([X_T]_{补}=(X_T+2^n) \pmod {2^n}\)

\((-2^n \le X_T \lt 2^n)\)

2, 定点小数(小数点在最左边),补码为:

\([X_T]_{补}=(X_T+2) \pmod {2}\)

\((-1 \le X_T \lt 1)\)

从上面定义可以很容易的看出,有效位全0时的补码表示的是负的最小值,因此对于8bit的有符号数,表示范围是-128到127.

补码0的表示是唯一的,机器数表示,不管是定点整数,还是定点小数,都是全0。这样带来了两个好处:

1, 0的表示唯一,减少了+0和-0之间的转换;

2, 少占用一个编码表示,使补码比原码能多表示一个最小负数。

补码的计算

可以通过定义证明补码在计算机中的计算规则:对于正数,符号位是0,补码就是其本身,无需计算;对于负数,符号位保持1,其余各位由真值的数值部分“各位取反,末尾加1”得到。

计算机来做取反很easy,再加上1,就能的负数的补码,因此,可以很容易地将减法转换成加法运算。(如果用原码表示负数,计算过程就会复杂许多)

反过来看看,如果从补码来反算出真值:

对于正数,补码的数值部分不做改变,跟原码一样,直接就能得到真值;

对于负数,将计算补码的过程反过来,将补码数值部分减1,然后再各位取反,符号位保持1。

再看看如何从\([X_T]_{补}\)求出\([-X_T]_{补}\):

还是“各位取反,末尾加1”,但是这次要连通符号位一起取反。

需要注意的是:最小负数取负后的补码表示是不存在的,如果对最小负数取负数,结果会溢出。

关于溢出(overflow)

确定位数的两个数的计算结果,有可能无法在同样的位数范围内表示出来,这时就发生了溢出。溢出的发生是因为产生了进位,而计算机由于存储限制,进位会被丢弃。

有的时候,这种丢弃是允许的,比如两个相同符号数相减,或者两个异号数相加。这时的溢出,恰好就是模运算,最后得到的结果正确。前面说到,如果对最小负数取负,结果会溢出,机器数的结果是没有变化。程序员需要特别注意。

有的计算机采用一种双符号位的补码表示,成为变形补码,也称为模4补码。在这种补码系统中,左符号是真正的符号位,右符号用来判别溢出。

无符号编码

有符号整数在计算机内,使用补码表示,因为这样减法和转换成加法,加快CPU的计算;

无符号整数在计算机内,有一种说法,使用无符号编码表示,其实就是原码表示,简单直接。

C语言中,要特别注意有符号数和无符号数混合运算的情况,系统会默认将有符号数也当成无符号数来对待,计算结果也是无符号数。

无符号编码在计算时,也会有溢出。

计算机模运算规则,补码,模运算和溢出相关推荐

  1. 计算机组成用变形补码运算,计算机组成原理补码加减法运算

    计算机组成原理补码加减法运算 (37页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 14.90 积分 补码加减法运算 2019年7月9日计算机组成原理 1 ...

  2. 考前自学系列·计算机组成原理·补码定点加减运算和溢出判断,浮点数的加减运算,原码的乘法

    补码定点加减运算和溢出判断 浮点数的加减运算 原码乘法

  3. 计算机组成原理补码加法证明,补码加减法运算(计算机组成原理).ppt

    <补码加减法运算(计算机组成原理).ppt>由会员分享,可在线阅读,更多相关<补码加减法运算(计算机组成原理).ppt(25页珍藏版)>请在皮匠网上搜索. 1.计算机组成原理2 ...

  4. 2.2.2 定点数的运算(移位、原码和补码的加减乘除、溢出概念和判别方法)

    文章目录: 1.定点数移位运算 (1)算术移位 (2)逻辑移位 (3)* 循环移位 2.定点数加减法运算 (1)原码加减 (2)补码加减 为什么机器中使用补码运算呢? 3.符号扩展 (1)正数符号扩展 ...

  5. 模4补码(也称为变形补码)详解

    模4补码又称为变形补码 概念是:用两个二进制位来表示符号位,其余位与补码相同,[例如模2补码的-3为1101,模2用1位,这里是最高位表示符号位,剩下3位是3的补码,同样模4补码表示-3为11_101 ...

  6. 【小罗的hdlbits刷题笔记2】补码运算中溢出的问题(Exams/ece241 2014 q1c)

    关于补码运算中进位溢出的问题及延伸,hdlbits中Exams/ece241 2014 q1c给出了很好的解释,首先来看问题: Assume that you have two 8-bit 2's c ...

  7. 定点补码加减法运算_计算机相关问题:谈谈我眼中的补码

    导读:补码是如何产生的.计算机如何表示负数. 1.前提认知 (1)计算机中只有加法器,加减法使用的都是加法器,同时计算机通过加法器左移累加实现乘法运算.右移累减实现除法运算. (2)补码是一种编码格式 ...

  8. 原码/补码的加减运算and溢出判断

    小数点的处理: 任意一个二进制数S都可以表示为 研究小数点就要研究阶码E的取值: 若E=0,则表示纯小数--代表定点小数: 例0.1111表示+0.1111,1.1111表示-0.1111. 若E=n ...

  9. 补码的加减法运算及溢出判断

    在计算机当中我们通常需要使用补码来进行二进制数字的加减法运算 首先先写出补码加减法运算的规则: [X+Y]补=[X]补+[Y]补     即补码的和等于和的补码 [X-Y]补=[X]补+[-Y]补  ...

  10. 如何高效进行模乘、模幂运算?——蒙哥马利算法(Montgomery Algorithm)从入门到精通

    蒙哥马利算法(Montgomery Algorithm)从入门到精通 ​ 加密算法中,模运算(包括模乘.模幂运算)是难以避免的,如何高效地进行模运算,是提高算法效率的一个关键. 直观的想法 ​ 在数学 ...

最新文章

  1. “当前不会命中断点 还没有为该文档加载任何符号”解决方法
  2. 为什么程序员总是打扮成这样一幅鬼样子
  3. oracle中查询某张表的大小
  4. 《neuralnetworks and deeplearning》学习笔记1-深入理解BP算法
  5. as常用固定搭配_MongoDB 常用查询操作
  6. Maxwell数据库数据采集-大数据week12-DAY1-Maxwell
  7. python语音读取
  8. 基于XML操作辅助类
  9. Android 如何通过Retrofit提交Json格式数据
  10. 矢量地图质量检查现状与需求分析
  11. python语句只能以程序方式打开_python如何处理程序无法打开
  12. DOTA数据集应用于Yolo-v4(-Tiny)系列2——使用Pytorch框架的Yolov4(-Tiny)训练与推测
  13. MATALB虚拟魔方构建
  14. c语言全部题目及答案,C语言全部题目及答案
  15. 计算机安全模式win7,安全模式启动,教您Win7怎么进入安全模式
  16. 如何在html添加悬浮页面,如何设置悬浮窗口?
  17. 企业服务是移动互联网的下一个风口
  18. 连接查询--嵌套查询
  19. 春节后面试别人的经历总结之一,好岗位分享给还在找工作中的软件开发爱好者们...
  20. 后知后觉者的学习方法

热门文章

  1. ddos php源码,ddos PHP版_php
  2. ffmpeg API变更 2009-03-01—— 2017-05-09变更
  3. 高数叔c语言课件,高数叔网课资源合集 高数上下、线代、模电、物理、复变合集...
  4. 8000份课程课后习题答案与大家分享~~
  5. 第一期:一款简单好用的屏幕画笔工具
  6. “实时SPC软件”的“实时”性指什么?一探究竟!
  7. 通信中间件 Fast DDS 基础概念简述与通信示例
  8. latex zip 数模模板_数学建模美赛LaTeX模板
  9. lzg_ad:EWF RAM Reg模式原理介绍
  10. 使用Origin从图片中准确提取数据