计算机系统的二进制运算(原码反码补码)

目录

 

什么是二进制

计算机系统中的二进制

原码

反码

补码

为什么负数的补码的求法是反码+1


 

什么是二进制

X进制指的就是以多少为基数和进制的数学表达方式算法。二进制数据是用0和1来表示的数,进位规则“逢二进一”,借位规则是“借一当二”,由18世纪德国数理哲学大师莱布尼兹发现。当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的。计算机中的二进制则是一个非常微小的开关,用“开”来表示1,“关”来表示0。比如:

0[0000],1[0001],2[0010],3[0011],4[0100]...

 

计算机系统中的二进制

在计算机系统中,是约定采用带符号的二进制,最高位的一位代表正负符号位。首先有以下几个概念,本文都以一字节8位的二进制为例:

原码

原码很好理解,最高位0代表正数,1代表负数,例如:1 的原码 = 00000001    -1的原码 = 10000001 。在原码参与计算时,正数之间的加法结果是不会有问题,而正数与负数相加,或负数与负数相加,就会有莫名其妙的结果,这都是符号位引起的。要解决这个问题,在运算时首先要考虑符号位,这就非常不便。

反码

由于计算机系统只存在加法,而1 - 1 === 1 +(-1)按原码进行计算会被表达为:

00000001 + 10000001,最终的运算结果为-2,显然不对。为了解决这个问题,反码出现了。

约定:正数的反码和原码一样,负数的反码是对原码除符号位外进行取反。

例如 :1 的反码 =00000001  -1 的反码 = 11111110

补码

按反码进行计算,1 - 1 === 1 +(-1)会被表达为00000001+11111110=11111111取反=10000000=-0,在反码中会存在对+0和-0的两种表达,这个时候补码出现。

约定:补码是在反码的基础上再次进行转化,正数的原码 、 反码、补码都一样,负数的补码是在反码的基础上 +1 。

例如:-1的补码 = 反码11111110 + 1 = 11111111。

1 - 1 === 1 +(-1)按补码进行计算会被表达为:

00000001 + 11111111 = 00000000(最高位溢出被丢弃)

补码运算其实是一种数值有限制、有溢出的模运算,也就是说在这种运算规则下,减去一个数其实相当于加上这个数的同余数。这就好比12进制的时钟,11-1=10点,11+11=22在时间表达上也是10点。

为什么负数的补码的求法是反码+1

负数的补码等于反码+1并不是补码的定义,只是负数补码正好就等于反码+1而已。求补码并不一定要先求反码,如果有兴趣了解补码的详细原理,建议阅读《计算机组成原理》,里面以“模”和“同余”的概念解释补码。

负数的反码加上这个负数的绝对值(符号为正)正好等于11111111,在加1就是100000000,也就是8位二进数的模,而负数的补码是它的绝对值的同余数,可以通过模减去负数的绝对值得到它的补码,所以负数的补码就是它的反码+1。

 

因此基于以上,由于补码表示中的符号位可以与数值位一起参加运算,并且可以将减法转换为加法进行运算,简化了运算过程,计算机中的二进制都以补码的形式参与运算和存储。

 

 

 

 

### 二进制原码反码补码的计算方法 #### 原码 原码是最简单的表示方式,最高位作为符号位,“0”代表正数,“1”代表负数,其余部分为数值绝对值的二进制形式。例如: - 正数 `+5` 的原码为 `00000101`(假设字长为8位)。 - 负数 `-5` 的原码为 `10000101`。 需要注意的是,在某些特殊情况下,如 `-0` 和 `+0` 都存在不同的编码[^1]。 #### 反码 反码是对原码的一种转换形式,其定义如下: - 对于正数,反码原码相同; - 对于负数,符号位外,其他各位按位取反。 例如: - 正数 `+5` 的反码仍为 `00000101`。 - 负数 `-5` 的原码为 `10000101`,将其非符号位取反后得到反码 `11111010`。 #### 补码 补码是为了简化加法器设计而引入的概念,能够统一处理正数和负数之间的运算。其定义如下: - 对于正数,补码原码相同; - 对于负数,可以通过两种方法获得补码: 1. 将该数的反码加一; 2. 或者直接将原码逐位取反后再加一。 例如: - 正数 `+5` 的补码仍是 `00000101`。 - 负数 `-5` 的原码为 `10000101`,通过上述规则可得其补码为 `11111011`[^2]。 以下是实现这一过程的一个 Python 函数示例: ```python def get_complements(num, bits=8): if num >= 0: original_code = format(num, f'0{bits}b') complemented_code = original_code else: abs_num = abs(num) original_code = '1' + format(abs_num, f'0{bits-1}b')[-(bits-1):] inverted_bits = ''.join(['1' if b == '0' else '0' for b in original_code[1:]]) complemented_code = bin(int('1'+inverted_bits, 2) + 1)[2:].zfill(bits) return { "original": original_code, "complemented": complemented_code } result = get_complements(-5) print(f"Original Code: {result['original']}, Complemented Code: {result['complemented']}") ``` 以上代码展示了如何基于给定整数生成对应的原码补码。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值