计算机组成原理学习笔记 原码,补码,反码,移码
时间: 2025-01-06 09:26:25 浏览: 83
### 计算机组成原理学习笔记
#### 原码、补码、反码和移码的概念及其相互转换
在计算机科学中,为了有效地处理正负数并简化硬件设计,引入了几种不同的编码方式来表示二进制数据。
- **原码 (Sign-Magnitude Representation)** 是最直观的一种形式,在这种模式下最高位作为符号位用来区分正负;其余各位则直接对应绝对值的二进制表达。对于八位机器而言,+7会被记作`0000 0111`而−7则是`1000 0111`[^1]。
- **反码 (One's Complement)** 的定义是在已知某个数X的原码基础上得到其相反数Y的方法之一:当X为正时保持不变;如果X是负数,则除了首位外其他所有位置上的比特都要翻转(即由0变1或反之)。例如十进制整数-14使用反码表示就是 `1111 0001`。
- **补码 (Two's Complement)** 提供了一种更加高效的解决方案用于加减运算操作。它基于这样的原则——任何给定字长n内的有符号整数Z都可以通过将其对应的无符号数值加上\(2^{(n)}\) 来获得。具体来说,求得一个数N的补码可以先计算它的反码再对该结果整体加一。因此,-14采用8-bit存储格式下的补码应写作`1111 0010`。
- **移码 (Bias Representation)** 主要应用于浮点数规格化过程中指数部分的表现上。简单理解的话,就是在原有真值的基础上增加了一个固定的偏置量bias从而使得所有的可能取值都变为正值范围之内便于比较大小关系。比如IEEE标准规定单精度float类型的E字段实际意义等于e+bias其中bias=127;双精度double里边相应地设定了另一个更大的常数1023作为偏置因子。
```python
def get_complements(value, bits):
"""获取指定长度bit位的原码/反码/补码"""
if value >= 0:
original_code = bin(value)[2:].zfill(bits)
one_complement = ''.join(['1' if b=='0' else '0' for b in original_code])
two_complement_int = int(one_complement, 2) + 1
two_complement_bin = bin(two_complement_int)[2:].zfill(bits)[-bits:]
return {
"original": f"0{original_code}",
"one_comp": f"{''.join('1' if c == '0' else '0' for c in ('0'+original_code))}",
"two_comp": f"{two_complement_bin}"
}
else:
abs_val = abs(value)
original_code = bin(abs_val)[2:].zfill(bits)
one_complement = ''.join(['1' if b=='0' else '0' for b in original_code])
two_complement_int = int(one_complement, 2) + 1
two_complement_bin = bin(two_complement_int)[2:].zfill(bits)[-bits:]
return {
"original": f"1{original_code}",
"one_comp": f"1{''.join('1' if c == '0' else '0' for c in original_code)}",
"two_comp": f"{'{:0%db}' % bits.format(int(not bool(value<0))*int(original_code,2)+(value<0)*two_complement_int)}"
}
print(get_complements(-14, 8))
```
阅读全文
相关推荐


















