ones' complement 和 two's complement

本文介绍了计算机科学中的两种重要概念——一的补码(反码)和二的补码(二进制补码)。这两种补码机制主要用于负数的表示,在计算机系统中有着广泛的应用。

ones' complement    译为“一的补码”,或译为”反码“。

two's complement     译为”二的补码“,或译为”二进制补码“。


详见维基百科 http://zh.wikipedia.org/wiki/%E6%9C%89%E7%AC%A6%E8%99%9F%E6%95%B8%E8%99%95%E7%90%86

或见于《深入理解计算机系统》2.2.1


### 反码补码的概念及计算方法 #### 一、反码 (Ones' Complement) 反码是一种用于表示带符号整数的方式。它主要用于早期的计算机设计中,在现代计算机中已经被补码取代。 - **定义**: 对于一个给定的二进制数,其反码可以通过将其所有位取反来获得(即将所有的 `0` 转换为 `1`,并将所有的 `1` 转换为 `0`)。 - **正数的反码**: 正数的反码与其原码相同。 - **负数的反码**: 如果是一个负数,则先写出该数绝对值的原码,然后对其按位取反即可得到它的反码[^3]。 例如: 假设使用8位二进制表示 `-7` 的反码: 1. 首先找到 `+7` 的原码:`00000111` 2. 将其逐位取反得反码:`11111000` #### 二、补码 (Two's Complement) 补码是目前几乎所有计算机用来表示有符号整数的标准方式。相比起原码反码,补码的优点在于可以直接参与算术运算而无需额外考虑符号问题。 - **定义**: 补码是在反码的基础上加 `1` 得到的结果。 - **正数的补码**: 原码一致。 - **负数的补码**: 若已知某负数的反码,则只需在此基础上加上 `1` 即可得到其补码。 同样以上述 `-7` 为例说明如何获取其补码: 1. 找到 `+7` 的原码:`00000111` 2. 获取反码:`11111000` 3. 加上 `1` 后变为补码:`11111001` #### 三、计算机中的应用 在实际操作过程中,当涉及到数值存储时,无论是哪种编码形式都会统一采用固定长度来进行表达。比如常见的字节大小为8比特(bit),意味着每一个数字都需要用满整个宽度去填充零或者设置标志位以表明它是正值还是负值[^4]。 另外值得注意的是关于溢出处理方面的问题——由于存在最大/最小界限约束,因此超出范围之外的数据将会被截断从而引发错误结果出现的情况也需要特别留意[^2]。 ```python def twos_complement_to_decimal(binary_str): """Convert a two's complement binary string to its decimal equivalent.""" if binary_str[0] == '1': # If the number is negative inverted_bits = ''.join(['1' if b == '0' else '0' for b in binary_str]) one_added = bin(int(inverted_bits, 2) + 1)[2:].zfill(len(binary_str)) return -int(one_added, 2) else: return int(binary_str, 2) print(twos_complement_to_decimal('11111001')) # Output should be -7 ``` 上述代码片段展示了如何将一个基于补码体系下的二进制字符串转换回相应的十进制数值。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值