数字电路中的原码,反码,补码的算法

本文介绍了计算机中表示数值的三种方法:原码、补码和反码。原码直接使用二进制表示数值,最高位作为符号位。补码则通过求反加一的方式表示负数,便于进行加减运算。反码是对原码除符号位外的所有位取反。这些编码方式是计算机科学的基础概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引进机器数的3种表示法:原码、补码和反码,是将符号位和数值位一起编码,机器数对应的原来数值称为真值
1.原码表示法
原码表示方法中,数值用绝对值表示,在数值的最左边用“0”和“1”分别表示正数和负数,书写成[X]原表示X的原码。
例如,在8位二进制数中,十进制数+23和-23的原码表示为: 
[+23]原=00010111
[-23]原=10010111
应注意,0的原码有两种表示,分别是“00……0”和“10……0”,都作0处理。 
2.补码表示法
一般在作两个异号的原码加法时,实际上是作减法,然后根据两数的绝对值的大小来决定符号。能否统一用加法来实现呢?这里先来看一个事实。对一个钟表,将指针从6拨到2,可以顺拨8,也可以倒拨4,用式子表示就是:6+8-12=2和6-4=2
这里12称为它的“模”。8与-4对于模12来说是互为补数。计算机中是以2为模对数值作加法运算的,因此可以引入补码,把减法运算转换为加法运算。
求一个二进制数补码的方法是,正数的补码与其原码相同;负数的补码是把其原码除符号位外的各位先求其反码,然后在最低位加1。通常用[X]补表示X的补码,+4和-4的补码表示为: 
[+4]补=00000100
[-4]补=11111100
例1.11 求6-4。
因为[6] 补=00000110,[-4] 补=11111100  
 
所以 00000110-00000100=00000110+11111100=00000010
3.反码表示法 
正数的反码等于这个数本身,负数的反码等于其绝对值各位求反。例如: 
[+12]反=00001100
[-12]反=11110011
总结以上规律,可得到如下公式:X-Y=X+(Y的补码)=X+(Y的反码+1)
### 原码反码补码的定义 #### 一、原码 原码是一种最简单的机器数表示方法。采用第一位表示符号,其余位表示数值的方法。例如,在8位二进制下: - 正数5的原码为 `0000 0101`[^3]。 - 负数-5的原码则为 `1000 0101`。 这种编码方式简单直观,但是存在两个零(+0 和 -0),这给计算带来了不便。 #### 二、反码 对于正数而言,其反码与其原码相同;而对于负数来说,则需要对其除符号位外的所有位求反得到反码。比如: - 单字节情况下,+5 的反码依然是 `0000 0101`; - 对于 -5 ,先写出它的原码形式 `1000 0101`,再将其后面七位取反变为 `1111 1010`[^1]。 这种方式虽然解决了部分问题,但在加减法运算时仍然不够理想。 #### 三、补码 为了使计算机能够更方便地处理带符号的数据并简化硬件设计,引入了补码的概念。具体规则如下: - **正数**:其补码等于自身的原码; - **负数**:可以通过两种途径获得: - 方法一:基于反码的基础上加上1来获取; - 方法二:直接按照模意义下的真值进行转换。 以单字节为例, - +5 的补码依旧是 `0000 0101`; - -5 的补码通过上述任一方法均可得出为 `1111 1011`[^2]。 值得注意的是,在实际应用中,现代计算机普遍采用了补码体系来进行数据存储与运算操作,因为这样可以有效地提高效率并且使得算法实现更为简洁。 ```python def get_complement(num, bit_length=8): """ 获取指定长度bit的补码 """ if num >= 0: return bin(num)[2:].zfill(bit_length) else: # 处理负数情况 positive_bin = bin(abs(num))[2:].zfill(bit_length) inverted_bits = ''.join(['1' if b=='0' else '0' for b in positive_bin]) complement = int(inverted_bits, 2) + 1 return bin(complement & ((1 << bit_length) - 1))[2:].zfill(bit_length) print(get_complement(-5)) # 输出: 11111011 ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值