计算机系统——原码反码补码

----注意下负数的反码和补码。


原码:


如果机器字长为n,那么一个数的原码就是用一个n位的二进制数,其中最高位为符号位:正数为0,负数为1。剩下的n-1位表示概数的绝对值。

例如: X=+101011 , [X]原= 00101011    X=-101011 , [X]原= 10101011 
位数不够的用0补全。

PS:正数的原、反、补码都一样:0的原码跟反码都有两个,因为这里0被分为+0和-0。

反码:

知道了什么是原码,那反码就更是张飞吃豆芽——小菜一碟了。知道了原码,那么你只需要具备区分0跟1的能力就可以轻松求出反码,为什么呢?因为反码就是在原码的基础上,符号位不变其他位按位取反(就是0变1,1变0)就可以了。


例如:X=-101011 , [X]原= 10101011 ,[X]反=11010100


补码:


补码也非常的简单就是在反码的基础上按照正常的加法运算加1。


例如:X=-101011 , [X]原= 10101011 ,[X]反=11010100,[X]补=11010101


PS:0的补码是唯一的,如果机器字长为8那么[0]补=00000000。


移码:


移码最简单了,不管正负数,只要将其补码的符号位取反即可。


例如:X=-101011 , [X]原= 10101011 ,[X]反=11010100,[X]补=11010101,[X]移=01010101





### 原码反码补码的定义 #### 1. 原码 (Sign-Magnitude Representation) 原码是一种最简单的机器数表示方法。最高位为符号位,“0”代表正数,“1”代表负数;其余各位则按二进制绝对值的形式来表示数值。 例如,8位二进制中的`0000 0001`表示+1,而`1000 0001`表示−1[^1]。 #### 2. 反码 (One's Complement) 对于正数而言,其反码与其原码相同。而对于负数来说,则需先求得该数对应的正数部分的原码,再将每一位取反(即0变1,1变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. ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值