原码/反码/补码在线计算器

本文详细介绍了原码、反码和补码的概念及计算方法,解释了它们在计算机内部表示数字的作用,以及如何通过在线工具进行计算。同时,文章还深入探讨了二进制在现代计算技术中的应用。

原码/反码/补码计算器,在线计算给定整数的原码/反码/补码。

工具链接:http://www.atoolbox.net/Tool.php?Id=952

原码, 反码和补码的概念

对于一个数, 计算机要使用一定的编码方式进行存储. 原码, 反码, 补码是机器存储一个具体数字的编码方式.

原码:原码就是早期用来表示数字的一种方式: 一个正数,转换为二进制位就是这个正数的原码。负数的绝对值转换成二进制位然后在高位补1就是这个负数的原码。

举例:

int类型的 3 的原码是 11B(B表示二进制位), 在32位机器上占四个字节,那么高位补零就得:

00000000 00000000 00000000 00000011

int类型的 -3 的绝对值的二进制位就是上面的 11B 展开后高位补零就得:

10000000 00000000 00000000 00000011      

但是原码有几个缺点,零分两种 +0 和 -0 。很奇怪是吧!还有,在进行不同符号的加法运算或者同符号的减法运算的时候,不能直接判断出结果的正负。你需要将两个值的绝对值进行比较,然后进行加减操作 ,最后符号位由绝对值大的决定。于是反码就产生了。

 

反码:正数的反码就是原码,负数的反码等于原码除符号位以外所有的位取反

举例:

int类型的 3 的反码是

00000000 00000000 00000000 00000011

和原码一样没什么可说的

int类型的 -3 的反码是

11111111 11111111 11111111 11111100

除开符号位,所有位,取反

解决了加减运算的问题,但还是有正负零之分,然后就到补码了

 

补码:正数的补码与原码相同,负数的补码为 其原码除符号位外所有位取反(得到反码了),然后最低位加1.

举例:

int类型的 3 的补码是:

00000000 00000000 00000000 00000011

int类型的 -3 的补码是

11111111 11111111 1111111 11111101

就是其反码加1

最后总结:

正数的反码和补码都与原码相同。

负数的反码为对该数的原码除符号位外各位取反。

负数的补码为对该数的原码除符号位外各位取反,然后在最后一位加1。

 

扩展资料
二进制是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”,由18世纪德国数理哲学大师莱布尼兹发现。当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的。计算机中的二进制则是一个非常微小的开关,用“开”来表示1,“关”来表示0。

20世纪被称作第三次科技革命的重要标志之一的计算机的发明与应用,因为数字计算机只能识别和处理由‘0’.‘1’符号串组成的代码。其运算模式正是二进制。19世纪爱尔兰逻辑学家乔治布尔对逻辑命题的思考过程转化为对符号"0''.''1''的某种代数演算,二进制是逢2进位的进位制。0、1是基本算符。因为它只使用0、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}") ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值