反码、补码

(1)正数的补码

  与原码相同。

  【例1】+9的补码是00001001。(备注:这个+9的补码说的是用8位的2进制来表示补码的,补码表示方式很多,还有16位2进制补码表示形式,以及32位2进制补码表示形式等。同一个数字在不同的补码表示形式里头,是不同的。比方说下面所要提到的-15的补码,在8位2进制里头是11110001,然而在16位2进制补码表示的情况下,就成了1111111111110001。在这篇补码概述里头涉及的补码转换默认了把一个数转换成8位2进制的补码形式,每一种补码表示形式都只能表示有限的数字。)

(2)负数的补码

  符号位为1,其余位为该数绝对值的原码按位取反;然后整个数加1。

例2】求-7的补码。

  因为给定数是负数,则符号位为“1”。

  后七位:+7的原码(0000111)→按位取反(1111000)→加1(1111001)

  所以-7的补码是11111001。

  已知一个数的补码,求原码的操作分两种情况:

  (1)如果补码的符号位为“0”,表示是一个正数,其原码就是补码

  (2)如果补码的符号位为“1”,表示是一个负数,那么求给定的这个补码的补码就是要求的原码。

### 原反码补码的概念 对于一个给定的数值,在计算机内部是以二进制的形式存储,而为了表示负数,则引入了原反码补码这三种编方式。 #### 原定义 原是最简单的机器数表示法。最高位为符号位,“0”代表正数,“1”代表负数;其余各位则用来表示该数的绝对值大小[^1]。 例如: - 正数 `+5` 的原是 `0000 0101` - 负数 `-5` 的原则是 `1000 0101` #### 反码定义 对于正数而言,其反码与其原相同; 而对于负数来说,除了符号位外,其他各位置上的比特取反即可得到对应的反码。 例子如下: - 正数 `+5` 的反码仍为 `0000 0101` - 负数 `-5` (即原 `1000 0101`)的反码变为 `1111 1010` #### 补码定义 同样地,当处理的是正值时,它的补码等于自身的原; 然而针对负值情况,先求得此数的反码之后再加一就构成了最终所需的补码形式。 具体操作如下所示: - 对于 `+5` ,由于它本身就是个正整数,因此其补码还是 `0000 0101` - 那么对于 `-5` 来说(假设已经得到了反码 `1111 1010`),那么再加上一位就是 `1111 1011` ### 各种编间的转换过程 从上述描述可以看出,由原反码再到补码的过程相对简单明了: 1. **正数** - 所有的编都是一样的,即 `[原 = 反码 = 补码]`。 2. **负数** - 若要获取某个负数X(-N)的补码,可按照下面两个步骤来进行: - 先写出|X|(也就是N)的原(注意这里只考虑除去了符号位后的纯数字部分),接着将其每一位按位取反获得反码; - 然后再在此基础上加上1便能得到所要找寻的那个负数X(-N)的补码。 ```python def int_to_binary(n, bits=8): """将整数n转化为指定长度bits的二进制字符串""" binary_str = format(abs(n), 'b').zfill(bits) if n >= 0: sign_bit = '0' else: sign_bit = '1' original_code = f"{sign_bit}{binary_str}" return original_code def complement_conversion(original_code): """实现原->反码->补码的转换函数""" # 判断输入是否合法 if not isinstance(original_code, str) or len(original_code)!=9 : raise ValueError("Invalid input") signed_flag = original_code[0] if signed_flag == '0': # 如果是正数,则三者相等 one_complement = two_complement = original_code elif signed_flag == '1': # 若为负数,则继续执行后续逻辑 magnitude_bits = ''.join(['1'if bit=='0'else'0'for bit in original_code[1:]]) one_complement = f'{signed_flag}{magnitude_bits}' carry_over = True temp_result = list(one_complement) for i in range(len(temp_result)-1,-1,-1): if temp_result[i]=='0'and carry_over==True: temp_result[i]='1' break elif temp_result[i]=='1' and carry_over==True: temp_result[i]='0' two_complement=''.join(temp_result) result={ "original":original_code, "one's complement":one_complement, "two's complement":two_complement } return result ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值