• C++
  • 原码反码补码教程

  • @ 2025-3-13 20:59:40

在计算机中,为了更方便地处理有符号数(带正负号的数),引入了原码、反码和补码的概念。下面为你详细介绍:

基本概念

  • 原码:是最直观的二进制表示方式,由符号位和数值位组成。最高位(最左边的位)是符号位,用0表示正数,1表示负数;其余位表示数值的大小。例如:
    • 十进制数 +5 ,若用8位二进制原码表示 ,就是00000101(首位0是符号位,表明是正数,后面0000101是5的二进制表示)。
    • 十进制数 -5 ,8位二进制原码是10000101(首位1是符号位,表示负数,后面依然是5的二进制表示) 。
  • 反码:是在原码基础上得到的。规则是正数的反码与原码相同;负数的反码是在原码的基础上,符号位保持不变,其余数值位按位取反(0变1,1变0)。例如:
    • 十进制数 +5 的反码,还是00000101(正数反码和原码一样)。
    • 十进制数 -5 的原码是10000101,其反码就是11111010(符号位1不变,后面0000101变成1111010) 。
  • 补码:是计算机中实际存储和处理有符号数的编码方式。规则为正数的补码与原码相同;负数的补码是在其反码的基础上,最低位加1。例如:
    • 十进制数 +5 的补码,同样是00000101(正数补码、反码、原码都一致) 。
    • 十进制数 -5 的反码是11111010,补码则是11111011(反码11111010最低位加1得到) 。

存在意义

  • 原码:简单易懂,符合人类直观的数字表示习惯,但用原码进行加减法运算时,规则复杂,要根据符号位判断是做加法还是减法,不利于计算机硬件实现。例如计算5 + (-3) ,用原码计算时,要先判断符号,再进行操作。
  • 反码:可看作是从原码到补码的过渡形式。在早期尝试简化运算的过程中出现,能在一定程度上简化运算,但仍存在一些问题,比如0有两种表示(+0的反码是00000000,-0的反码是11111111) 。
  • 补码:解决了原码和反码在运算上的缺陷。一方面,使符号位和数值位能统一处理,在计算时无需单独处理符号位;另一方面,将减法运算转化为加法运算,比如计算5 - 3 ,可以转化为5 + (-3)的补码形式进行计算,简化了计算机硬件的运算电路设计。同时,0的补码表示唯一,都是00000000 。

相互转换

  • 正数:原码、反码、补码的形式完全相同。比如十进制数 +8 ,8位二进制原码是00001000,反码和补码同样是00001000 。
  • 负数
    • 原码转反码:符号位不变,其余数值位按位取反。如 -6 的原码是10000110,反码就是11111001。
    • 反码转补码:在反码基础上,最低位加1。-6的反码11111001,补码就是11111010。
    • 补码转原码:方法和负数原码转补码过程相反,即先减1得到反码,再将数值位取反(符号位不变) 。如已知补码11111010,减1得到11111009,再取反得到原码10000110 。

4 条评论

  • @ 2025-3-13 21:21:45

    选择题

    1. 十进制数 +10 的 8 位原码是( ) A. 00001010 B. 10001010 C. 00010100 D. 10010100
    2. 十进制数 -15 的 8 位反码是( ) A. 10001111 B. 11110000 C. 11110001 D. 01110000
    3. 十进制数 -20 的 8 位补码是( ) A. 10010100 B. 11101100 C. 11101011 D. 01101100
    4. 已知一个数的 8 位补码是 11110000,其对应的十进制数是( ) A. -16 B. -15 C. 15 D. 16
    5. 若采用 8 位二进制补码表示整数,其表示范围是( ) A. -128 到 127 B. -127 到 127 C. -128 到 128 D. -127 到 128
    6. 正数的原码、反码和补码( ) A. 各不相同 B. 原码和反码相同,与补码不同 C. 原码和补码相同,与反码不同 D. 三者都相同
    7. 在计算机中,通常使用( )来表示和存储数值。 A. 原码 B. 反码 C. 补码 D. 以上都不是
    8. 计算 5 + (-3) 时,使用补码运算,5 的 8 位补码是 00000101, -3 的 8 位补码是 11111101,相加结果的 8 位二进制是( ) A. 00000010 B. 10000010 C. 00000110 D. 11111110
    9. 一个 8 位二进制数的原码是 11111111,其对应的十进制数是( ) A. -127 B. -128 C. 127 D. 128
    10. 以下关于 0 的原码、反码和补码表示,正确的是( ) A. 原码和反码有两种表示,补码只有一种表示 B. 原码、反码和补码都有两种表示 C. 原码和补码有两种表示,反码只有一种表示 D. 原码、反码和补码都只有一种表示

    判断题

    1. 原码的符号位用 0 表示正数,1 表示负数。( )
    2. 负数的反码是在原码基础上,所有位按位取反。( )
    3. 正数的补码与原码相同,负数的补码是在反码基础上最低位加 1。( )
    4. 计算机在进行数值运算时,使用原码可以简化运算逻辑。( )
    5. 若一个 8 位二进制补码是 00000000,其对应的十进制数是 0。( )
    6. 反码解决了 0 的两种表示问题。( )
    7. 在 8 位二进制补码表示中, -128 的补码是 10000000。( )
    8. 计算两个数相加时,使用补码运算无需考虑符号位。( )
    9. 一个数的原码和反码不可能相同。( )
    10. 补码表示的数值范围比原码和反码表示的数值范围大。( )

    答案

    选择题答案

    1. A
    2. B
    3. B
    4. A
    5. A
    6. D
    7. C
    8. A
    9. A
    10. A

    判断题答案

    1. ×(负数的反码是符号位不变,其余数值位按位取反)
    2. ×(计算机使用补码可以简化运算逻辑)
    3. ×(补码解决了 0 的两种表示问题)
    4. ×(正数的原码和反码相同)
    • @ 2025-3-13 21:03:30

      下面为你提供原码、反码和补码在不同数值及运算场景下的具体实例。

      单个数值的原码、反码和补码表示

      为了方便说明,下面以 8 位二进制数为例。

      正数情况

      以十进制数 +18 为例:

      • 原码:符号位为 0 表示正数,数值位为 18 的二进制表示 0010010,补齐到 7 位后为 0010010,所以 +18 的 8 位原码是 00010010。
      • 反码:正数的反码与原码相同,因此 +18 的反码也是 00010010。
      • 补码:正数的补码同样与原码相同,所以 +18 的补码还是 00010010。

      负数情况

      以十进制数 -25 为例:

      • 原码:符号位为 1 表示负数,数值位为 25 的二进制表示 0011001,补齐到 7 位后为 0011001,所以 -25 的 8 位原码是 10011001。
      • 反码:负数的反码是在原码基础上,符号位不变,数值位取反,得到 11100110。
      • 补码:负数的补码是在反码基础上最低位加 1,即 11100110 + 1 = 11100111。

      原码、反码和补码在运算中的实例

      原码运算问题

      计算 5 + (-3),使用原码进行计算:

      • 5 的 8 位原码是 00000101。
      • -3 的 8 位原码是 10000011。 在原码运算时,计算机需要先判断符号位,然后进行相应的加法或减法操作。这里进行加法时,由于符号不同,实际要做减法 5 - 3,这增加了运算的复杂性。

      补码运算优势

      同样计算 5 + (-3),使用补码进行计算:

      • 5 的 8 位补码是 00000101(正数补码与原码相同)。
      • -3 的 8 位原码是 10000011,反码是 11111100,补码是 11111101。 将两个补码相加:00000101 + 11111101 = 100000010,由于是 8 位运算,最高位的进位 1 溢出舍弃,结果为 00000010,转换为十进制就是 2,与实际计算结果相符。而且在补码运算中,无需单独处理符号位,直接进行加法运算即可,简化了计算机的运算逻辑。

      特殊数值 0 的表示

      原码

      在原码表示中,0 有两种表示形式:

      • +0 的 8 位原码是 00000000。
      • -0 的 8 位原码是 10000000。

      反码

      反码中 0 也有两种表示形式:

      • +0 的 8 位反码是 00000000。
      • -0 的 8 位反码是 11111111。

      补码

      补码解决了 0 的两种表示问题,0 只有一种表示形式:

      • 0 的 8 位补码是 00000000。

      超出表示范围的情况(溢出)

      假设使用 4 位二进制补码表示数值,其表示范围是 -8 到 7。 计算 5 + 3:

      • 5 的 4 位补码是 0101。
      • 3 的 4 位补码是 0011。 两数相加:0101 + 0011 = 1000,按照补码规则,1000 表示 -8,这显然是错误的结果,原因是 5 + 3 = 8 超出了 4 位补码所能表示的范围,产生了溢出。

      通过以上实例,可以更深入地理解原码、反码和补码的特点以及它们在计算机中的应用。

      • @ 2025-3-13 21:01:12

        在计算机系统中,数值一律用补码来表示和存储,原因主要有以下两点:

        • 统一处理符号位和数值域:补码的表示方式使得符号位和数值位可以统一处理,在进行运算时无需像原码那样对符号位单独进行判断和操作 。例如,在加法运算中,不管参与运算的数是正数还是负数,都可以直接按照补码形式进行相加。
        • 统一加减法运算:使用补码可以将减法运算转化为加法运算。在一定的模运算体系下,减去一个数等同于加上这个数的补码,这样计算机硬件中只需要设计加法电路就可以实现加减法运算,简化了硬件设计。

        原码和反码通常并不直接用于数据的存储,它们更多是作为计算补码的过渡形式:

        • 原码:是一种简单直观的二进制表示方式,由符号位和数值位组成,最高位(最左边的位)为符号位,0表示正数,1表示负数,其余位表示数值的大小。比如8位二进制中,+5的原码是00000101,-5的原码是10000101 。但原码在进行加减法运算时,需要根据符号位判断是做加法还是减法,这不利于计算机硬件实现。
        • 反码:正数的反码与原码相同;负数的反码是在原码的基础上,符号位保持不变,其余数值位按位取反(0变1,1变0)。例如+5的反码是00000101,-5的原码是10000101,其反码是11111010 。反码可看作从原码到补码的过渡形式,虽然在一定程度上简化了运算,但仍存在一些问题,如0有两种表示(+0的反码是00000000,-0的反码是11111111)。
        • @ 2025-3-13 21:00:37

          原码、反码、补码超通俗教程(0基础+大量实例)

          一、为啥需要原码、反码、补码?

          计算机要处理带正负的数(如 +5、-3),但直接用二进制表示负数,运算会很麻烦。于是设计了原码、反码、补码,让计算机更高效处理有符号数,尤其是补码,让加减法运算规则统一,硬件实现更简单。


          二、原码:最直观的二进制表示

          规则

          • 符号位:最高位(最左边),0 表示正数,1 表示负数。
          • 数值位:剩下的位表示数的大小,直接写十进制数的二进制形式。

          实例

          • 正数:+7(8位二进制)
            原码:00000111(首位 0 是符号位,0111 是 7 的二进制)。
          • 负数:-10(8位二进制)
            原码:10001010(首位 1 是符号位,1010 是 10 的二进制)。

          三、反码:过渡性编码

          规则

          • 正数:反码 = 原码。
          • 负数:符号位不变,其余数值位“0变1,1变0”(按位取反)。

          实例

          • 正数:+12 原码是 00001100,反码也是 00001100
          • 负数:-4 原码 10000100,反码:
            符号位 1 不变,其余取反 → 11111011

          四、补码:计算机真正存储的编码

          规则

          • 正数:补码 = 原码 = 反码。
          • 负数:反码的基础上,最低位加 1。

          实例

          • 正数:+3 补码 00000011(和原码一样)。
          • 负数:-6
            原码:10000110 → 反码:11111001 → 补码:11111010(反码最低位加 1)。

          五、三码转换详细操作

          1. 正数转换

          • 原码、反码、补码完全相同。
            例:+15(8位)
            原码:00001111 → 反码:00001111 → 补码:00001111

          2. 负数转换

          • 原码→反码:符号位不变,数值位取反。
            例:-9 原码 10001001 → 反码 11110110
          • 反码→补码:反码最低位加 1。
            例:反码 11110110 → 补码 11110111
          • 补码→原码:补码先减 1 得反码,再数值位取反(符号位不变)。
            例:补码 11110111 → 减 1 得反码 11110110 → 原码 10001001

          六、补码的神奇应用:统一加减法

          计算机用补码运算,减法变加法!
          例:计算 5 - 3(即 5 + (-3))

          • 5 的补码:00000101
          • -3 的补码:11111101
          • 相加:00000101 + 11111101 = 100000010(舍去最高位 1,结果 00000010,即十进制 2,正确!)

          通过补码,计算机无需区分加减法,硬件电路设计更简单,这就是补码的核心价值!

          • 1