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
是一个特殊值,表示-32768
(short
的最小值)。
统一加减法运算
- 补码表示法只需做二进制加法(考虑进位),即使是负数的加法也适用。
- 加法和减法可以通过相同的加法电路完成,无需区分:
- 正数加正数
- 正数加负数
- 负数减正数等情况。
总结
- 所有有符号整数的二进制表示都是补码:
- 正数的补码与原码相同。
- 负数的补码是其反码加
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