前言

今天看到微机原理里面提到

对一个负数取补码相当于用0减去一个负数

一下子没有反应过来,不由得去找了一些资料,这里简单总结一下。以下内容大部分参考这个知乎大佬写的文章。

原码,反码,补码

  首先我们先来复习一下原码,反码和补码。
  我们都知道,现代计算机都是以二进制来表示数的,那为了能够表示负数,人们约定,最高位用来表示符号位,0代表正数,1代表负数。这就是原码。但是呢,这个原码有很多问题,一个就是只能计算正数与正数相加,负数参与运算会出错(因为有符号位参与运算),另一个就是0有两种表示法:+0和-0。
  原码最大的问题其实是两个相反数相加不为0(因为只有符号位不同),因此人们又发明了反码:正数和0的反码等于它本身,负数的反码等于除符号位的其他各位按位取反。这样一来就保证了两个相反数相加的结果是0。但是仍然有问题,那就是负数相加会出错,且0仍然有两种表示方法。
  为了解决负数加减的问题,最后提出了补码的概念。补码等于反码加1,这句话只能算是一种运算规律,因为补码概念的提出与反码没有任何关系,它的思想来自于生活最常见的“模”的思想,比如时钟。具体可以去知乎看看相关文章。

补码的美妙与神奇之处

  • 补码的最高位仍然代表了这个数的符号,即0为正数,1为负数,且0只有一种补码表示方法
  • 其实通过补码是可以直接算出真值来的! 以4位寄存器为例,1011为-3,它的补码为1101,那么当我们只知道1101时,可以将最高位赋予权值-8,再代入计算:-8*1+4*1+0*2+1*1=-3,正确!因此也体现出补码最高位符号位的重要性。
  • 补码的补码等于原码! 这一点我觉得十分巧妙,其实本质就相当于是数值取了两次模,这样就得到原值。

一直被混淆的“变补”

  相信很多人都听过一句话:“减去一个数相当于加上这个数的补码”。如果不去仔细验证,按照补码的思想,很容易认为这句话是对的,但实际上这里混淆了一个非常重要的概念,那就是补码变补的关系。
  补码如前所述,属于一种码制,其思想来源是生活中常见的取模思想。而变补是一种运算方法,它的提出是因为计算机的CPU中的运算器ALU只是加法计算器,不能计算减法,因此在计算A-B这样的表达式时,只能转化为A+(-B),因此,就需要一种二进制位层面的求相反数的方法。对于原码而言,求相反数就是将最高位的符号位取反即可,但是在实际加法运算中,数都是用补码表示的,因此需要当一个数为补码时应该怎么快速求出其相反数,这种运算就叫变补
  变补运算的方法就是补码所有位(含符号位)按位取反,然后加1,相当于是原码变补码的一个扩展版,因此很多人会混淆这二者的关系。
  总结来说:变补运算可以实现:补码A - 补码B = 补码A + 补码B的变补运算值,因此,也就有了文章开头的那句结论,其中的“补码”实际上是指变补运算。

【Tools】彻底搞懂原码,反码,补码和变补。相关推荐

  1. 原码一位乘法器设计_十分钟带你彻底搞懂原码、反码、补码

    点击上方"程序员大白",选择"星标"公众号 重磅干货,第一时间送达 编辑 | 程序员大白公众号来源丨https://www.cnblogs.com/zhangz ...

  2. 关于计算机中 原码, 反码, 补码 详解

    本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希 ...

  3. 原码, 反码, 补码, 移码 详解

    本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希 ...

  4. 关于 原码 反码 补码 位运算

    二进制 原码:最高位为符号位,0为正  1为负 正数的原码 反码 补码 都是相同的 反码:负数的反码为原码符号位不变 其它对应变化(1变0 0变1) 补码:等于 反码+1 3^-3 =? 运算过程 - ...

  5. 10.原码 反码 补码

    +7的原码:0000 0111 -7的原码:1000 0111   第一位0代表正数,1代表负数,第一位为符号位 +7的反码:0000 0111 正数反码和原码一样 -7的反码:1111 1000   ...

  6. java进制原码_Java 一一 进制、原码 反码 补码、移位操作

    进制 二进制 和 十进制 相互转换 十进制 和 十六进制 相互转换 原码,反码,补码 原码.反码.补码: 在计算机内, 有符号数有三种表示法: 原码, 反码, 补码. 所有的数据的运算都是采用 补码 ...

  7. 大端 小端 原码 反码 补码 及内存中的表现

    小端 和 大端 在内存中存储时,都是从内存的低地址往高地址存,即0x00000000 -> 0xffffffff 以汉字 "严"为例,Unicode码是4E25,需要两个字节 ...

  8. 原码 反码 补码 详解

    一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1.机器数 一个数在计算机中的二进制表示形式,  叫做这个数的机器数.机器数是带符号的,在计算机用一个数的最高位存放 ...

  9. python二进制反码例题_python中的进制转换和原码,反码,补码

    python中的进制转换和原码,反码,补码 计算机文件大小单位 b = bit 位(比特) B = Byte 字节 1Byte = 8 bit #一个字节等于8位 可以简写成 1B = 8b 1KB ...

  10. 原码 反码 补码 详解

    本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希 ...

最新文章

  1. Spark MLlib介绍
  2. Python:Python语言编程软件安装的几大姿势之详细攻略
  3. 网络安全产品 / 相关产品简要说明
  4. diskgenius 接触“只读“失败_相亲总是失败,这三个步骤你都做了吗?
  5. android网络框架
  6. CSS3/jQuery创意盒子动画菜单
  7. 国产电源管理芯片有哪些?
  8. 微型计算机显示器的标准接口,HJ/T 313-2006 环境标志产品技术要求 微型计算机、显示器...
  9. 家用电脑如何安装服务器系统,普通电脑安装服务器系统
  10. 神威计算机英语,“神威太湖之光”取代“天河二号” 成全球最快超级计算机...
  11. 指纹识别研究(一) 指纹的三级特征
  12. 免费英语听力工具voscreen
  13. 旋转矩阵【北京航空航天大学】
  14. 男人四十一枝花,我花开后百花杀!Orz..繁忙的工作之余,joke一下~~
  15. Canvas画布完成一个数字钟表
  16. 浙江师范大学2017年计算机类录取分,2018浙江师范大学各省录取分数线【最新】...
  17. fgo显示服务器内部错误,fgo服务器数据库异常
  18. C/C++程序员简历模板(转载)
  19. python network programming tutorial
  20. Linux属于软件还是硬件,Linux系统教程_Linux系统软件处理和硬件处理的区别有什么不一样?...

热门文章

  1. Linux系统夯住,Linux 系统安装XXD
  2. “五一”出游大数据报告发布,快来看...
  3. idea破解方式注册
  4. zjoi 2008 杀蚂蚁
  5. win8系统读不出移动硬盘的原因和解决方法
  6. 胶水防霉剂能预防贴合材料发霉
  7. Vue+SpringBoot+OSS+element实现图片上传服务器+图片展示墙
  8. excel一列求和_excel功能小技巧:自动求和的注意事项
  9. xml文件中的大于等于等一些特殊符号
  10. 学会理解并编辑fstab