原码转反码转补码

本文详细介绍了如何将负数转换成原码,并进一步讲解了从原码到补码的转换过程。针对负数,首先求其绝对值的原码,再将最高位改为1即得原码;接着通过取反加1的方法可以得到补码。

对于正数来说,原码=反码=补码;

但是对于负数来说,那就不一样了。来看看吧!

1,对于负数怎么求原码???
① 先求负数的绝对值的原码
② 把最高位(也叫符号位)改为1
③ OK了,举个例子。以-5为例子。在这里插入图片描述
2,负数的原码怎么到补码 ???
① 把原码里所有的数(除最高位外)取反(0变1,1变0)
② 对上一步得到的数加1。在这里插入图片描述

负数的原码到补码的步骤就是四个字:取反+1

负数的反码到补码的步骤也是四个字:取反+1

原码补码反码是计算机中表示有符号数的三种方式,下面分别介绍它们之间的转换方法。 ### 正数 对于正数而言,原码补码反码是相同的。例如,十进制数 `+5`,若用 8 位二进制表示,原码是 `0000 0101`,其补码反码同样是 `0000 0101`。 ### 负数 - **原码反码**:保持符号位不变,其余位取反。例如,十进制数 `-5` 的原码是 `1000 0101`,那么它的反码就是 `1111 1010`。 - **原码补码**:先将原码转换反码,然后在反码的基础上加 1。例如,十进制数 `-5` 的原码是 `1000 0101`,反码是 `1111 1010`,补码则是 `1111 1011`(`1111 1010 + 1 = 1111 1011`)。 - **反码原码**:保持符号位不变,其余位取反。例如,反码 `1111 1010`,其原码为 `1000 0101`。 - **反码补码**:在反码的基础上加 1。例如,反码 `1111 1010`,补码是 `1111 1011`(`1111 1010 + 1 = 1111 1011`)。 - **补码原码**:先在补码的基础上减 1 得到反码,然后保持符号位不变,其余位取反。例如,补码 `1111 1011`,减 1 得到反码 `1111 1010`,再将反码转换原码 `1000 0101`。 - **补码反码**:在补码的基础上减 1。例如,补码 `1111 1011`,其反码是 `1111 1010`(`1111 1011 - 1 = 1111 1010`)。 ### 特殊情况 对于 -128(8 位二进制),在用补码运算的结果中,`[1000 0000]` 补就是 -128,但是 -128 并没有原码反码表示,因为实际上是使用以前的 -0 的补码来表示 -128,若对 -128 的补码表示 `[1000 0000]` 补算原码,得到的是 `[0000 0000]` 原,这是不正确的 [^1]。 以下是 Python 代码示例,用于实现原码补码反码之间的转换: ```python def decimal_to_binary(decimal, bits=8): """将十进制数转换为二进制字符串""" binary_str = bin(decimal & (2**bits - 1))[2:].zfill(bits) if decimal < 0: binary_str = '1' + binary_str[1:] return binary_str def original_to_complement(original): """原码补码""" if original[0] == '0': return original else: # 符号位不变,其余位取反加 1 inverted = ''.join('1' if bit == '0' else '0' for bit in original[1:]) complement = bin(int('1' + inverted, 2) + 1)[3:] return '1' + complement def original_to_inverse(original): """原码反码""" if original[0] == '0': return original else: # 符号位不变,其余位取反 return '1' + ''.join('1' if bit == '0' else '0' for bit in original[1:]) def complement_to_original(complement): """补码原码""" if complement[0] == '0': return complement else: # 补码减 1 后取反 minus_one = bin(int(complement, 2) - 1)[3:] inverted = ''.join('1' if bit == '0' else '0' for bit in minus_one) return '1' + inverted def inverse_to_original(inverse): """反码原码""" if inverse[0] == '0': return inverse else: # 符号位不变,其余位取反 return '1' + ''.join('1' if bit == '0' else '0' for bit in inverse[1:]) # 测试 decimal_num = -5 original_code = decimal_to_binary(decimal_num) print(f"原码: {original_code}") inverse_code = original_to_inverse(original_code) print(f"反码: {inverse_code}") complement_code = original_to_complement(original_code) print(f"补码: {complement_code}") original_from_complement = complement_to_original(complement_code) print(f"补码原码: {original_from_complement}") original_from_inverse = inverse_to_original(inverse_code) print(f"反码原码: {original_from_inverse}") ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值