计算机原码、反码、补码理解

本文深入解析计算机中数制编码方式,包括原码、反码及补码的概念与运算原理,并探讨了它们在解决运算问题中的作用。

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

计算机使用一定的编码方式进行存储,原码、反码、补码是机器存储一个具体数字的编码方式

1 原码 

第一位表示符号 正数第一位为0,负数第一位为1,其余位表示值;以8位二进制表示

+1 原码 0000 0001

-1  原码 1000 0001

第一位为符号位(正负数符号位),所以8位二进制原码范围为 

1111 1111 ,0111 1111  即 -127,127

原码是人容易理解的计算表示方式

2 反码

正数的反码就是其本身

负数的反码是在原数基础,符号位不变(第一位不变),其余各个位取反。

+1  原码  0000  0001   反码  0000 0001

-1  原码   1000 0001    反码  1111  1110

负数的反码是不可直观看出,最好转换成原码方式进行计算,就是上例子中

反码 1111  1110  转换成原码  1000 0001 ,就是-1了

3 补码

正数的补码就是其本身

负数的补码是在原数基础,符号位不变(第一位不变),其余各个位取反,再+1 

其实负数的补码,是在负数的反码基础+1 即可

+1  原码 0000 0001   反码 0000 0001  补码 0000 0001

-1  原码  1000 0001  反码  1111 1110   补码  1111  1111

跟反码相同,不可以直观看出,负数的补码转换成原码进行计算,方便理解

补码1111 1111 先减一 1111 1110(现在反码形式了) ,第一位(符号位不变),

其余各位取反  1000  0001(原码形式了) -1 

原码是最容易理解为什么还需要引入反码和补码呢?

计算机运算只保留加法方式,为了解决原码减法的问题,出现了反码

例如   1-1 = 1+(-1)= 原码 0000 0001 + 1000 0001 = 反码 0000 0001 + 1111 1110 = 反码 1111 1111  

= 原码 1000 0000 = -0 

但是在 +0 和 -0 其实表示为0 ,二进制位 0000  0000 ,1000 0000,为了解决0的

符号问题以及0的两个编码问题,出现了补码

1-1 = 1+(-1) = 原码 0000 0001 + 1000 0001 = 补码 0000 0001 + 1111 1111 

= 补码 1 0000 0000(1没有在这个1字节里面) = 原码 0000 0000 

这样0就用 0000  0000 表示了,就没有 -0的存在了

同时可以使用 1000 0000 表示-128

-1 + -127 = 原码 1000 0001 + 1111 1111 = 补码 1111 1111 + 1000 0001 = 补码 1000 000 

=反码 1111 1111 = 原码 1000 0000

这个地方 反码 1000 0000 向反码转换可以 先原码-128 是 -128为正数 1000 0000

这个第一位为1 应该是符号位,溢出丢弃进位法则:在用有符号整形表示二进制数时,当后面的非符号位

发生溢出是,符号位不变,直接丢弃溢出为的进位

-128 原码 1000 0000 最高位1表示符号位,后面7位发生溢出,进位丢弃,符号位不变

反码 1111 1111  补码 1000 0000 反码末位加1,使后7位再次溢出,进位丢弃,符号位不变

综上所述,使用补码,修复了0的符号存在的-0和+0问题,还能够多表示一个最低数

即8位二进制,使用原码或反码表示范围 -127,+127;

使用补码表示范围 -128,127;机器使用补码存储在补码表示是多保存一个最小值

### 原码反码补码的定义 #### 1. 原码 (Sign-Magnitude Representation) 原码是一种最简单的机器数表示方法。最高位为符号位,“0”代表正数,“1”代表负数;其余各位则按二进制绝对值的形式来表示数值。 例如,8位二进制中的`0000 0001`表示+1,而`1000 0001`表示−1[^1]。 #### 2. 反码 (One's Complement) 对于正数而言,其反码与其原码相同。而对于负数来说,则需先求得该数对应的正数部分的原码,再将每一位取反(即0变11变0),得到的结果就是这个负数的反码。 比如,在8位系统里,`-7`的原码是`1000 0111`,那么它的反码则是`1111 1000`[^3]。 #### 3. 补码 (Two's Complement) 同样地,当涉及到正值时,补码等于原码。但对于负值情况有所不同:首先获取对应正数的原码,接着对其逐位取反获得反码之后再加上1即可得出最终结果——这就是所谓的“加一法则”。 举例说明,仍以8位为例,如果要表达`-5`的话: - 正五的原码:`0000 0101` - 对应的反码:`1111 1010`(每位都翻转) - 加上1后的补码:`1111 1011` 因此,`-5`在八位下的补码形式就应该是`1111 1011`[^2]。 ### 计算实例展示 假设现在有一个十进制整数 `-14` 需要用到七位加上一位符号位共八个比特位来进行编码: - **原码**: `1000 1110` (其中首位'1'作为符号标记) - **反码**: 将上述除开首字符外的所有数字反转得到 `1111 0001`. - **补码**: 继续给上面所得出的数据加1变成 `1111 0010`. 值得注意的是,实际应用中几乎总是采用补码而非其他两种方式存储数据,因为这可以简化硬件设计并提高效率[^4]. ```python def to_binary(n, bits=8): """Convert an integer n into a binary string with specified number of bits.""" return format(n if n >= 0 else (1 << bits) + n, '0{}b'.format(bits)) print(to_binary(-14)) # Output should be the two's complement representation of -14 using default bit length. ```
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值