彻底弄清:原码、反码、补码

        在计算机科学中,原码、反码和补码是表示有符号整数(即可以表示正数、负数和零)的三种不同方式。这些表示方法主要用于二进制系统中,特别是在计算机内部处理整数时。下面将详细解释这三种编码方式,并通过例子来说明它们。

原码 (Sign-Magnitude Representation)

        原码是一种直接表示数值的方法,其中最高位用来表示符号(0为正,1为负),其余位表示数值本身。

  • 正数的原码:最高位为0,其余位表示该数的绝对值。
  • 负数的原码:最高位为1,其余位表示该数的绝对值。

例如,对于8位二进制数:


反码 (One’s Complement)

        反码是一种用于简化二进制加减运算的表示方法。对于正数,反码与原码相同;对于负数,反码是原码除符号位外其余各位取反(0变1,1变0)。

  • 正数的反码:与原码相同。
  • 负数的反码:符号位不变,其余位取反。

例如,对于8位二进制数:

  • 数字 +5 的反码是 00000101(与原码相同)。
  • 数字 -5 的反码是 11111010(原码除符号位外,其余位取反)。


补码 (Two’s Complement)

        补码是目前计算机系统中最常用来表示有符号整数的方法。补码通过取反码再加1得到,这样可以使得加法和减法运算统一处理,简化硬件设计。

  • 正数的补码:与原码相同。
  • 负数的补码:反码加1。

例如,对于8位二进制数:

  • 数字 +5 的补码是 00000101(与原码相同)。
  • 数字 -5 的补码是 11111011(反码 11111010 加1)。

举例说明

以8位二进制数为例,解释原码、反码、补码:

数值原码反码补码
+5000001010000010100000101
-5100001011111101011111011

        从补码中我们可以看到,最小的负数(-128)在8位二进制中用补码表示为 10000000,其原码和反码都不直接表示这个值。补码系统有一个特性,即最大的正数和最小的负数在数值上是对称的。例如,在8位系统中,最大的正数是 01111111(+127的补码),最小的负数是 10000000(-128的补码)。

        补码的这种表示方法使得计算机在进行加减运算时,可以像处理无符号整数一样处理有符号整数,只需要在最后处理可能发生的溢出即可。

补充对称性:

  • 最大的正数 (+127) 的补码表示为  01111111
  • 最小的负数 (-128) 的补码表示为   10000000
  • 如果我们观察这两个补码的位模式,可以看到它们在补码的“中心”是对称的。在8位补码中,中心点可以看作是从 01111111 到 10000000 的过渡,即从全1到全0的变化。

举例说明

让我们通过以下步骤来观察这种对称性:

  • 计算 +127 的补码

    • 原码:01111111(最高位0表示正数,其余位表示127)
    • 反码:01111111(对于正数,反码与原码相同)
    • 补码:01111111(对于正数,补码与原码相同)
  • 计算 -128 的补码

    • 原码:10000000(最高位1表示负数,其余位表示128)
    • 反码:11111111(除符号位外,其余位取反)
    • 补码:10000000(反码加1,由于加1导致最高位的1溢出,所以结果仍然是 10000000

        在补码系统中,当我们从 +127 增加到 +128 时,会发生溢出,数值会“环绕”回到 -128。这是因为补码系统中,每个数值的表示都是唯一的,不存在像原码和反码那样的冗余表示(例如,原码和反码中的 11111111 表示 -127,但也可以表示 -0)。


用途介绍:

1. 表示有符号整数

在计算机中,整数分为有符号(正数和负数)和无符号(只有正数)两种。原码、反码和补码提供了一种方法来表示有符号整数。

2. 简化硬件设计

  • 原码:虽然直观,但原码的加减运算规则复杂,不利于硬件实现。
  • 反码:反码简化了减法运算,因为减去一个数等同于加上它的反码。但反码有两个零的表示(例如,00000000 和 11111111),这在硬件上处理起来比较复杂。
  • 补码:补码进一步简化了加减运算,只需要处理加法即可,并且只有一个零的表示(00000000),这大大简化了计算机的算术逻辑单元(ALU)的设计。

3. 加减运算的统一

  • 使用补码,加法和减法运算可以统一处理。这意味着计算机的硬件只需要实现加法逻辑,减法可以通过加一个数的补码来实现。

实际应用

  • 在实际的计算机系统中,几乎所有的现代计算机架构都使用补码来表示有符号整数,因为它提供了最有效、最直接的方式来执行算术运算。
  • 在编程语言中,当我们声明有符号整数变量时,这些变量在底层硬件上就是以补码形式存储和操作的。

总结来说,原码、反码和补码是为了在计算机系统中有效地表示和处理有符号整数,而补码因其独特的优势成为了最广泛使用的表示方法。


总结:

        1.二进制的最高位是符号位:0表示正数,1表示负数(口诀: 0->0 1-> -)
        2.正数的原码,反码,补码都一样(三码合一)
        3.负数的反码=它的原码符号位不变,其它位取反(0->1,1->0)
        4.负数的补码=它的反码+1,负数的反码=负数的补码﹣1
        5.   0的反码,补码都是0
        6.在计算机运算的时候,都是以补码的方式来运算的.

解释第5点:
正0的原码、反码和补码
  • 原码00000000(8位表示,最高位0表示正数,其余位表示0)
  • 反码00000000(对于正数,反码与原码相同)
  • 补码00000000(对于正数,补码与原码相同)
负0的原码、反码和补码

在补码系统中,通常不区分正0和负0,因为它们的补码表示是相同的。但是,如果我们按照定义来计算负0的反码和补码,以下是步骤:

  • 原码10000000(8位表示,最高位1表示负数,其余位表示0)
  • 反码11111111(对于负数,反码是将原码中除符号位外的所有位取反)
  • 补码00000000(反码加1,11111111 + 1 = 100000000,由于我们只考虑8位,所以最高位的1溢出,剩下的是00000000

因此,无论是正0还是负0,其反码和补码都是00000000

举例说明

假设我们有一个8位的二进制系统,我们想要表示数字0:

  • 对于正0

    • 原码:00000000
    • 反码:00000000(正数的反码等于原码)
    • 补码:00000000(正数的补码等于原码)
  • 对于负0(虽然通常不区分,但为了完整性):

    • 原码:10000000
    • 反码:11111111(将原码中除符号位外的所有位取反)
    • 补码:00000000(反码加1,得到100000000,去掉溢出的最高位1)

        在计算机系统中,通常不区分正0和负0,因此0的反码和补码都被简单地表示为00000000。这种表示简化了算术运算,因为在补码系统中,加法和减法可以统一处理,不需要考虑符号。

    好啦,今天的干货就到这啦~    有什么建议或疑问的小伙伴欢迎到评论区留言!

猜你感兴趣的方面:

#你还能区分逻辑运算符吗?

#如何区分++i和i++???

#强制类型转换是什么?

#自动类型转换有哪些细节???

#JVM、JRE、JDK之间的关系

#彻底区分:基本数据类型、引用数据类型和包装类型

#成员变量、局部变量和静态变量的区别

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值