8.反码和补码

  1. 8.反码和补码
    1. 8.1 知识点
      1. 原码是什么
      2. 反码与补码是什么
      3. 为什么要用补码表示负数
        1. 总结
    2. 8.2 知识点代码
      1. Lesson08_反码和补码.cpp

8.反码和补码


8.1 知识点

原码是什么

原码是有符号整数的最简单表示方法,使用一个符号位和数值位来表示一个整数。

  • 最高位(最左侧的位)是符号位:
    • 0 表示正数
    • 1 表示负数
  • 其余位表示数值的绝对值。

例如,一个 short 类型(2个字节,16位)的原码表示如下:

  • 5 的原码:0000 0000 0000 0101
  • -5 的原码:1000 0000 0000 0101

注意:如果计算机中正负数都用原码表示,会出现两个零的问题。因此,计算机中存储整数时并不会采用原码来存储。

反码与补码是什么

反码

反码是一种对负数进行编码的方法,是对原码的一种改进,通常作为一种中间形式。

  • 正数的反码与原码相同。
  • 负数的反码是对它的原码非符号位取反(符号位不变)。

例如:

数值 原码 反码
5 0000 0000 0000 0101 0000 0000 0000 0101
-5 1000 0000 0000 0101 1111 1111 1111 1010

补码

补码是现代计算机系统中最常用的负数表示法,解决了两个零的问题。

  • 正数的补码与原码相同。
  • 负数的补码是在其反码基础上加 1

例如:

数值 原码 反码 补码
5 0000 0000 0000 0101 0000 0000 0000 0101 0000 0000 0000 0101
-5 1000 0000 0000 0101 1111 1111 1111 1010 1111 1111 1111 1011

在程序中,所有的整数都会使用补码规则表示并以二进制形式存储在内存中。

为什么要用补码表示负数

解决两个零的问题

  • 在原码和反码表示法中,存在两个零的情况:+0-0
  • 在补码表示法中,只有一个零,即:0000 0000 0000 0000
  • 补码形式的 1000 0000 0000 0000 是一个特殊值,表示 -32768short 的最小值)。

统一加减法运算

  • 补码表示法只需做二进制加法(考虑进位),即使是负数的加法也适用。
  • 加法和减法可以通过相同的加法电路完成,无需区分:
    • 正数加正数
    • 正数加负数
    • 负数减正数等情况。

总结

  • 所有有符号整数的二进制表示都是补码:
    • 正数的补码与原码相同。
    • 负数的补码是其反码加 1
  • 补码表示法不仅简化了硬件电路的设计和实现,还大大提高了数值运算的效率和一致性。
  • 它是计算机系统中表示和处理有符号整数的标准方法。

8.2 知识点代码

Lesson08_反码和补码.cpp

#include <iostream>
using namespace std;
int main()
{
    std::cout << "反码和补码\n";

    //注意:原码、反码、补码主要是针对有符号整数的规则

    #pragma region 知识点一 原码是什么
    //原码:
    //原码是有符号整数的最简单表示方法,使用一个符号位和数值位来表示一个整数
    //最高位(最左侧的位)是符号位:
    // 0 表示正数,1 表示负数
    //其余位表示数值的绝对值
    //比如(一个short 2个字节 16位):
    // 5  = 0000 0000 0000 0101
    // -5 = 1000 0000 0000 0101
    // 如果在计算机中正负数都用原码表示,会出现两个0的问题
    // 因此计算机中存储整数时并不会采用原码来存储
    #pragma endregion

    #pragma region 知识点二 反码、补码是什么
    // 反码
    // 反码是一种对负数进行编码的方法,它是对原码的一种改进
    // 反码算是一个中间码,一般不会直接使用
    // 假设原码为 A
    // 正数的反码和原码相同 = A;
    // 负数的反码是对它的原码非符号位取反 = ~A(符号位不变)
    //            原码                     反码
    // 5  = 0000 0000 0000 0101     0000 0000 0000 0101
    // -5 = 1000 0000 0000 0101     1111 1111 1111 1010

    // 补码
    // 补码是现代计算机系统中最常用的负数表示法,解决了两个零的问题
    // 假设原码为 A  反码为B
    // 正数的补码和原码相同 = A
    // 负数的补码是在它的反码基础上加1 = B + 1
    //            原码                     反码                      补码
    // 5  = 0000 0000 0000 0101     0000 0000 0000 0101      0000 0000 0000 0101
    // -5 = 1000 0000 0000 0101     1111 1111 1111 1010      1111 1111 1111 1011
    // 程序中所有的整数都是用补码规则表示的2进制存储在内存中的
    #pragma endregion

    #pragma region 知识点三 为什么要用补码表示负数
    //主要原因:
    //1.解决两个零的问题
    //  在原码和反码表示法中,存在两个零的情况 即:+0和-0
    //  而在补码表示法中,只有一个零 就是 0000 0000 0000 0000
    //  而补码 1000 0000 0000 0000 代表的数是
    //  反码:
    //  1000 0000 0000 0000 - 1 = 0111 1111 1111 1111
    //  原码:
    //  1000 0000 0000 0000 它是一个非常特殊的数 为 -32768 为short的最小值
    //2.统一加减法运算
    //  只需做二进制加法(考虑进位),即使负数的加法也适用
    //  加法和减法可以通过相同的加法电路来完成,无需区分是正数加正数、正数加负数,还是负数减正数等情况
    //等等
    #pragma endregion

    #pragma region 总结
    //所有有符号整数的二进制表示都是补码(正数的补码和原码相同,负数的补码是它的反码+1)
    //这不仅简化了硬件电路的设计和实现,也大大提高了数值运算的效率和一致性
    //补码表示法是计算机系统中表示和处理有符号整数的标准方法
    #pragma endregion
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏