首先我们来了解下补码的定义,在很多资料上说补码都是从原码说起,但实质上补码是有其定义的:

补码定义:计算机中二进制形式的补数。

这个定义是比较抽象的,下面我将举一些实际的例子来解释。

二进制形式:就是0和1组成的串,例如数字3的二进制形式是11,数字-9的二进制形式是11001。

补数:初中时我们学过互补角,两个角加起来等于180度,则称两个角互补。在日常生活中,将某物体顺时针旋转270度和逆时针旋转90度能达到同样的效果,把时钟里的分钟顺时针调整40分钟和逆时针调整20分钟,分针最后的位置是一样的。这时270是90的补数,90也是270的补数;40和20也同理。

那么计算机中为什么要用补码呢?

因为使用补码可以把减法运算变成加法运算,以此来简化逻辑算术单元设计。现在的计算机里只有加法器,没有减法器。例如7-3可以转换为7+(-3)。为进一步理解,我们再来了解两个定义。

补码计算法定义:非负数的补码是其原码本身;负数的补码是其绝对值的原码最高位符号位不变,其它位取反,再加1。

模定义:一个负整数的绝对值与负整数补码的和。

前面提到的270+90=360,360就是模,40+20=60,60就是模。模其实就是计量范围,在数学计算中就是进位的那一位,像个位数计算3+7=10,这个10就是超出了个位数的计量范围,只能进位。在二进制数中,当位数为n时,模为。

在二进制位数n为4时,7的原码是0111,补码是0111;

-3的绝对值3的原码是0011,再对其原码求补码得到1101,所以-3用二进制形式为1101。

将两数补码相加,得到0100,换成十进制是4,结果正确。

  0111+ 1101

0100

这里我们注意到两二进制数相加结果为10100,最高位的1因为二进制位数的限制为4,所以被丢弃了。10100=00100+10000,被丢弃是10000,即-16。

我们再根据模的定义得知模等于-3和其补码的和,即模=0011+1101=10000,即-16。

我们再来看-3的补码1101,如果将其当成无符号数来看,再最前面加个0即可当成无符号数,得到01101,转换成十进制得其值为13,此时我们发现7-3的本质是转换成了7+13-16,而-16不是真正的减16,而是丢弃,所以这个式子中就只存在一个加法7+13,这就是计算机把减法转换成加法的本质。

最后再来看看原码的补码为什么取反后要加1,如果不加1,那原码-3(1011)取反后就是1100,不看最高位符号位,我们发现011+100=111,即7,而模为8,也就是说当所有位都为1时还比模少了1,所以最后要加上1。

顺带提一下为什么各数据类型的取值范围负数的绝对值比正数大1,就拿byte来说,其位数为8,最小值是-128(1000000),最大值是127(0111111)。

最大值127是01111111应该很好理解,正数最高位肯定是0,要使数值最大,后面肯定要为1。

最小值-128是10000000。很多人根据最大值127理所当然的想到最小值是-127,而且其二进制为11111111。其实不然,首先11111111不是-127,而是-1,再者,我们来看负数二进制转为十进制的计算方法(任取一个负数10101010):

(-1)x+(0x+1x+0x+1x+0x+1x+0x)

所以,(-1)x加括号里的正数,要使值最小,括号里要为0,所以后,7位要全为0,即10000000。

补码是什么?补码有什么用?相关推荐

  1. 数的机器码表示:原码、反码、补码、变形补码、移码和浮点数编码

    我们平时书写的数据如+110.-111称为数的真值,而数在经过特定的方式编码后在计算机中的表示称为数的机器码.为满足计算机中不同操作的要求,对于一个数常见的编码方式有如下几种. 一.原码 (1) 整数 ...

  2. c语言为什么要用补码,什么是补码为什么要用补码

    什么是补码为什么要用补码? 1.计算机中为什么使用补码形式: 电脑里面的数值用补码来表示,一方面是为防止0有2个编码,另外是为了将减法运算用加法运算表示出来,以达到简化电路的作用(有负数的概念,减法也 ...

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

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

  4. 计算机中真值的概念,【概念辨析】真值、机器数、原码、反码、补码、变形补码、移码...

    吐槽:最近在学中国大学MOOC的一门课程<计算机系统基础(一)>,初学感觉对这些乱七八糟的码比较纠结,所以写个辨析,希望帮自己理清概念也希望帮到其他初学者.ps:纯属手敲和个人理解,不过有 ...

  5. 原反补码的相互转换、补码加减法计算规则及例题

    原.反.补码 正整数的原码.反码和补码是一样的 对于负数: 1.2. 原码 ⇋ 反码:符号位不变,数值位按位取反 3.4. 原码 ⇋ 补码:符号位不变,数值位按位取反,末位 + 1 5. 反码 → 补 ...

  6. c语言如何算补码,C语言补码(C语言学习笔记)

    记录 在学习C语言数据范围时了解到了补码的概念,记录一下什么是补码,补码怎么运算的 运算 原文链接:https://www.cnblogs.com/lsgsanxiao/p/5113305.html ...

  7. 补码(complement)!:补码的定义(艾伦克莱门茨编著)和用途

    文章目录 国内的教材和国外的某些教材对补码的定义有所出入 此处系国外的说法: 国内的教材和国外的某些教材对补码的定义有所出入 此处系国外的说法:

  8. -7的补码用计算机,补码计算器-计算机求补码

    在计算机中,负数以其正值的补码形式表达. 什么叫补码呢?这得从原码,反码说起. 原码:一个整数,按照绝对值大小转换成的二进制数,称为原码.5的反码:将二进制数按位取反,所得的新二进制数称为原二进制数的 ...

  9. 6位有符号补码阵列乘法器_C/C++学习日记:原码、反码和补码

    一.什么是原码.反码和补码 我们知道,在计算机内部存储的带符号数都是以补码形式存储,用补码形式进行运算的.什么是一个数的补码?为什么要用补码?这要从数的原码.反码开始讲.我们以整型数为例,且假定字长为 ...

  10. 有符号类型的最小负数的补码的由来

    有符号类型的最小负数的补码的由来 一. 16位的有符号整数(int) 在计算机中是用补码存储数据 为什么不用原码存 就是因为原码表示不了最小值-32768 如果是原码表示的话,编码中+0是用16个0表 ...

最新文章

  1. Set Matrix Zeroes leetcode
  2. git常用命令及分支简介
  3. 消息中间件的核心思想
  4. 【英语学习】【Level 08】U01 Let's Read L4 Hot off the press
  5. 浅谈K短路算法(KSP)之二(YEN .J算法求解)
  6. 苹果已招聘两名梅赛德斯前工程师 其中一人曾在保时捷工作近6年
  7. Android中处理崩溃异常和分析日志的两种思路
  8. JAVA与C#的区别
  9. hadoop2.6---常用命令
  10. 全民一起玩python实战篇百度云_【全民一起玩python】下载 - 面包树
  11. 领导者核心能力七力模型
  12. 状态码如何返回Http/1.1 200 OK
  13. 痞子衡嵌入式:ARM Cortex-M文件那些事(5)- 映射文件(.map)
  14. rm 好凶残,太 TM 吓人了!
  15. TensorFlow学习笔记——《TensorFlow技术解析与实战》
  16. 最简单ListView显示联系人姓名和电话号码
  17. TinyOS总体介绍
  18. 第一篇博客,写给自己
  19. 高项.2021案例默写
  20. 什么模式下不可使用曝光补偿_曝光的正确顺序是什么 曝光正确顺序介绍

热门文章

  1. Sprite 拼合图
  2. 心系天下三星W2019 更懂精英,更懂生活
  3. 我的大学时代.篇章一
  4. Arduino 项目笔记 |一种自动清洗毛笔的装置
  5. Linux中查看进程状态信息
  6. touchend在iphone 6s中不生效
  7. 重定向次数过多怎么解决(www.bing.com 重定向次数过多)
  8. C#使用说明官方手册
  9. 如何判断List是否为空
  10. 百度一面二面三面 总结