最全源码、反码、补码(超详细解析)_源码补码和反码(1),2024年最新C C++高级工程师面试实战

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

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的补码


![img](https://img-blog.csdnimg.cn/img_convert/56aa3b1caca2abad685db845963193a6.png)
![img](https://img-blog.csdnimg.cn/img_convert/9f4ccbda1049e83018f944ae653d197e.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**

基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值