目录
一、基础知识补充
(1)计算机的语言表示:
在现代的计算机中主要采用的数字集成电路完成,数字电路通过高低电平只能表示0和1,所以就出现了,计算机只会识别0和1。无论是存储还是计算,计算机均采用二进制体系完成。
例如:十进制 4 ---------- 用二进制表示为 100
(2)计算机的基础单位和数据类型:
1. bit------------ 比特
2. byte --------- 字节 ------------- 1byte = 8bit
3. KB ------------ 千字节 ---------- 1KB = 1024byte
4. MB ----------- 兆 ---------------- 1MB = 1024KB
5. GB ----------- 吉字节 ---------- 1GB = 1024MB
6. TB ----------- 太字节 ---------- 1TB = 1024GB
7. PB ----------- 拍字节 ----------- 1PB = 1024TB
其中在C语言中的一些特定的数据类型存储也是有一定的范围的:
1. char -------- 1字节 2. short --------- 2字节
3. int -------- 4字节 4. long ---------- 4字节
5. long long -------- 8字节 6. float ---------- 4字节
7.double ---------- 8字节
(3)二进制数
数字在计算机中的二进制表示形式也被称为机器数,其中 二进制数有两个特点:
1. 二进制数是带符号的,即分正、负数。其中若是正数最高位显示 0 ,若是负数最高位显示 1
2. 二进制位通常也会受到数据类型的限制,比如 char 型 1 个字节 8 个比特位。
举例:int 2 ; ------------------二进制表示:00000000 00000000 00000000 00000010
二、源码、反码、补码
(1)概念
1. 应用范围:源码、补码、反码只能应用在整数中:正整数、负整数
2. 在正整数中:源码 =反码 =补码
3. 在负整数中:如果是负数,将源码的符号位不变,其余各位取反,得到反码
如果是负数,将反码 加 。1,得到补码
举例:int a = 3 ;
int a = 3 ; // int整型为4字节,32个bit位
//源码:00000000 00000000 00000000 00000011
//反码:00000000 00000000 00000000 00000011
//补码:00000000 00000000 00000000 00000011
//因为是正整数所以 源码=反码=补码
举例:int a = -3 ;
int a = -3 ; // int 为整型4个字节32个bit位
//因为是负数,所以最高位是 1
//源码:10000000 00000000 00000000 00000011
//源码符号位不变,其余各个位按位取反,得到反码
//反码:11111111 11111111 11111111 11111100
//反码+1,得到补码
//补码:11111111 11111111 11111111 11111101
4.重点区分:整形表达式计算使用在内存中的是补码。
打印和看到的都是源码。
(2)理解
估计大家应该有和我开始学习时一样的想法,计算机直接使用二进制就好了,为啥要区分源码、反码、补码。其实对于计算机而言,实现加法相对简单,相反减法就显得有些复杂,需要考虑借位逻辑,很难实现且效率太低,慢慢的减法器就被加法器给替代了,使得算法更加的简单和高效。
下面我将依次对源码、反码、补码进行分析,并说明为什么,二进制运算使用补码。
1.源码
使用源码运算正整数加法时没有问题的,因为正整数的源码=反码=补码。
举例:两个正整数相加,二进制加下来也是10
int a = 5 ; // int为4字节32个bit位
int b = 5 ; // 00000000 00000000 00000000 00000101 --二进制
int sum=0 ;
sum = a + b ; // 00000000 00000000 00000000 00000101
// 00000000 00000000 00000000 00000101 相加
// 此时sum = 10
// 00000000 00000000 00000000 00001010 ---二进制
此时使用负整数去运算相加。
int a = 3; // 00000000 00000000 00000000 00000011 3的源码=反码=补码
int b = -2; // 10000000 00000000 00000000 00000010 -2的源码
int sum = 3 + (-2) ; //相加
// 10000000 00000000 00000000 00000101 此时结果为-5
2.反码
针对于反码,其实弥补了源码不能实现减法运算的问题,但是最高位会发生进位,需要低位加1,此时的运算效率就会大大的降低。
举例:计算3+(-2)就会发现结果为1。
int a = 3 ; // 00000000 00000000 00000011 源码=反码=补码
int b = -2 ;// 10000000 00000000 00000010 -2的源码
// 11111111 11111111 11111101 -2的反码
//此时将两个反码相加
// 最高位多出的(1) 100000000 00000000 00000001 --1
举例:计算1+(-1)
int a = 1 ; // 00000000 00000000 00000000 00000001 源码=反码=补码
int b = -1 ; // 10000000 00000000 00000000 00000001 -1的源码
// 11111111 11111111 11111111 11111110 -1的反码
// 此时让 a+b 两个反码相加
// 11111111 11111111 11111111 11111111 结果也为0
这种情况发现 11111111 和 00000000 此时都为0,计算机中很难判断。所以得出结论反码能实现加减法,但是有瑕疵,且效率低。
3.补码
补码应用在计算机二进制,计算、存储的编码格式,同时解决了源码的缺陷和反码的瑕疵。其中在高位溢出是,可以直接丢弃。
举例:3 + (-2)
int a = 3 ; // 00000000 00000000 00000000 00000011 源码=反码=补码
int b = -2 ; // 10000000 00000000 00000000 00000010 -2的源码
// 11111111 11111111 11111111 11111101 -2的反码
// 11111111 11111111 11111111 11111110 -2的补码
//此时两个数的补码相加
// 100000000 00000000 00000000 00000001 最高位溢出一个1,直接丢弃
//最终结果 00000000 00000000 00000000 00000001 ----1
举例 :1+(-1)
int a = 1 ; // 00000000 00000000 00000000 00000001 源码=反码=补码
int b = -1 ; // 10000000 00000000 00000000 00000001 -1的源码
// 11111111 11111111 11111111 11111110 -1的反码
// 11111111 11111111 11111111 11111111 -1的补码
//此时两个数的补码相加
//最终结果:100000000 00000000 00000000 00000000 做高位溢出一个1 ,直接丢弃
//最终结果:00000000 00000000 00000000 00000000 ----0
最终 很去确切的输出了0,并没有反码那么繁琐,此时补码就体现出它不仅可以实现加减法运算而且算法运算更加的简单,计算效率更高。
三、共勉
这篇文章就是我对计算机中源码、反码、补码的理解,如果大家有什么问题可以在评论区提出来哦,我们大家一起加油,冲冲冲!!!
下一期,我会在这篇文章的基础上提出 按位与、按位或、按位异或、移位操作符的理解,希望大家继续关注我,我会第一时间更新的哦!!!