【Tools】彻底搞懂原码,反码,补码和变补。
前言
今天看到微机原理里面提到
对一个负数取补码相当于用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】彻底搞懂原码,反码,补码和变补。相关推荐
- 原码一位乘法器设计_十分钟带你彻底搞懂原码、反码、补码
点击上方"程序员大白",选择"星标"公众号 重磅干货,第一时间送达 编辑 | 程序员大白公众号来源丨https://www.cnblogs.com/zhangz ...
- 关于计算机中 原码, 反码, 补码 详解
本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希 ...
- 原码, 反码, 补码, 移码 详解
本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希 ...
- 关于 原码 反码 补码 位运算
二进制 原码:最高位为符号位,0为正 1为负 正数的原码 反码 补码 都是相同的 反码:负数的反码为原码符号位不变 其它对应变化(1变0 0变1) 补码:等于 反码+1 3^-3 =? 运算过程 - ...
- 10.原码 反码 补码
+7的原码:0000 0111 -7的原码:1000 0111 第一位0代表正数,1代表负数,第一位为符号位 +7的反码:0000 0111 正数反码和原码一样 -7的反码:1111 1000 ...
- java进制原码_Java 一一 进制、原码 反码 补码、移位操作
进制 二进制 和 十进制 相互转换 十进制 和 十六进制 相互转换 原码,反码,补码 原码.反码.补码: 在计算机内, 有符号数有三种表示法: 原码, 反码, 补码. 所有的数据的运算都是采用 补码 ...
- 大端 小端 原码 反码 补码 及内存中的表现
小端 和 大端 在内存中存储时,都是从内存的低地址往高地址存,即0x00000000 -> 0xffffffff 以汉字 "严"为例,Unicode码是4E25,需要两个字节 ...
- 原码 反码 补码 详解
一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1.机器数 一个数在计算机中的二进制表示形式, 叫做这个数的机器数.机器数是带符号的,在计算机用一个数的最高位存放 ...
- python二进制反码例题_python中的进制转换和原码,反码,补码
python中的进制转换和原码,反码,补码 计算机文件大小单位 b = bit 位(比特) B = Byte 字节 1Byte = 8 bit #一个字节等于8位 可以简写成 1B = 8b 1KB ...
- 原码 反码 补码 详解
本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希 ...
最新文章
- Spark MLlib介绍
- Python:Python语言编程软件安装的几大姿势之详细攻略
- 网络安全产品 / 相关产品简要说明
- diskgenius 接触“只读“失败_相亲总是失败,这三个步骤你都做了吗?
- android网络框架
- CSS3/jQuery创意盒子动画菜单
- 国产电源管理芯片有哪些?
- 微型计算机显示器的标准接口,HJ/T 313-2006 环境标志产品技术要求 微型计算机、显示器...
- 家用电脑如何安装服务器系统,普通电脑安装服务器系统
- 神威计算机英语,“神威太湖之光”取代“天河二号” 成全球最快超级计算机...
- 指纹识别研究(一) 指纹的三级特征
- 免费英语听力工具voscreen
- 旋转矩阵【北京航空航天大学】
- 男人四十一枝花,我花开后百花杀!Orz..繁忙的工作之余,joke一下~~
- Canvas画布完成一个数字钟表
- 浙江师范大学2017年计算机类录取分,2018浙江师范大学各省录取分数线【最新】...
- fgo显示服务器内部错误,fgo服务器数据库异常
- C/C++程序员简历模板(转载)
- python network programming tutorial
- Linux属于软件还是硬件,Linux系统教程_Linux系统软件处理和硬件处理的区别有什么不一样?...