原码减法等于加补码(减一个数等于加这个数的补码)

本文目录
减一个数等于加这个数的补码
根源在于“计数系统的周期性”。
用十进制来说明,比较容易理解。
两位十进制数(0~99),计数周期就是 10^2 = 100。
此时有: 24 - 1 = 23
24 + 99 = (一百) 23
如果你舍弃进位,只保留两位:
+99 与-1,就是等效的。
加法,就可以代替减法。
同理,+98 也可以代替-2。
。。。
这些正数,就称可为“负数的补数”。
计算公式:补数 = 负数 + 周期。
零和正数,就不需要变换了。
-----------------
上述公式,也可以用到计算机中。
一个字节,有 8 位 2 进制,计数范围是:
0000 0000~1111 1111 (十进制 255)。
计数周期是:2^8 = 256。
-1 的补码,就是:255 = 1111 1111。
-2 的补码,就是:254 = 1111 1110。
。。。
-128,就是:128 = 1000 0000。
零和正数,都不许转换,必须直接参加运算。
所以,根本就没有“正数补码”的概念。
有人基本概念不清,就会说:正数的补码是其本身!
根本就不存在的事,他们说的,就像真事一样。
--------------
用补码计算:4-1 = 3。
列竖式计算如下:
4:0000 0100
补: 1111 1111
--相加-----------
(1)0000 0011 :+3
舍弃了进位,这次运算,就是正确的。
原码,补码
1:我们来看一下补码的求得过程:将原码的各位取反,再加1,得到补码。举个例子,1001,它全部取反之后就是0110,再加1得到0111。将原码与补码加相,会得到10000。我们应该知道,计算机最基础的运算器只能做加法,所以叫累加器,它做不了减法。所以当需要减法的时候我们取减数的补码,用被减数去加这个补码。如果是1111-1001=0110的话就相当于1111-(10000-0111)=1111
0111=0110,其中0111是1001的补码。由于码不像数字,码是有位数的限制的,当有多于其位数的操作时是不表现出来的,所以减去一个数的原码就相当于加上它的补码。相信,看明白了这一条,第三个问题也就解决了。
2.规定……惯例的,当初就这么说的,反正二进制就两个数,不是0就是1,取反就是对方。1比0大,正数比负数大……我是这样想的,这一点我不敢肯定。
4.不记符号位的话,原码
补码=100...0(0的位数与原码的位置一致),那你说这两个码是不是互为原补码?取补码之后再取一次补码就是自身了。
为什么要用补码相加来表示减法运算
计算机运算器只有加法计算器没有减法计算器,因此减法运算要用负数相加代替。
最简单的例子:1-1=0,可以表示为1+(-1)=0,用8位二进制数表示1、-1的话,分别为0000 0001、1000 0001
最高位0、1分别表示正负,如果直接用0000 0001和1000 0001相加的话得到的结果并不为0,而我们知道两个相反数的和为0,这时候就需要计算机把这两个有符号的二进制数分别转换成各自的补码进行相加才能得到正确的结果0。
负数的补码等于其符号位不变,其余各位取反(即反码)再加1,如1000 0001→1111 1110→1111 1111
正数的补码和反码等于其原码,如:0000 0001→0000 0001
这时候1111 1111+0000 0001=0000 0000(忽略掉符号位的进位)得到正确的结果0.

更多文章:
数据库管理系统和数据库系统分别侧重(数据库,数据库管理系统,数据库系统,这三个分别是什么意思并举个实例)
2026年9月7日 17:00
springmvc的依赖(springMVC的注入方式有哪几种,这与springMVC依赖)
2026年9月7日 14:00
display flex 自动换行(overflow-y:hidden;overflow-x:auto;无效解决方法)
2026年9月7日 11:00
timestamp without time zone(Postgresql中to_date()函数使用问题)
2026年9月7日 09:40






