当前位置: 首页 > news >正文

源码、反码、补码(超详细解析)

目录

一、基础知识补充

   (1)计算机的语言表示:

    (2)计算机的基础单位和数据类型:

    (3)二进制数

二、源码、反码、补码

(1)概念

(2)理解

    1.源码

    2.反码

    3.补码

三、共勉


一、基础知识补充

   (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,并没有反码那么繁琐,此时补码就体现出它不仅可以实现加减法运算而且算法运算更加的简单,计算效率更高。

三、共勉

    这篇文章就是我对计算机中源码、反码、补码的理解,如果大家有什么问题可以在评论区提出来哦,我们大家一起加油,冲冲冲!!!

    下一期,我会在这篇文章的基础上提出 按位与、按位或、按位异或、移位操作符的理解,希望大家继续关注我,我会第一时间更新的哦!!!

http://www.xdnf.cn/news/822565.html

相关文章:

  • 深度神经网络(Deep Neural Networks,DNN)模型
  • RAID磁盘阵列详解
  • white-space几种属性的用法(处理空格)
  • BeanUtils工具类下copyProperties拷贝对象的用法
  • 51单片机下载不进去程序?(pcb的设计问题)
  • OTN技术
  • C语言回调函数详解(全网最全)
  • 预警功能深度测评:系统如何降低设备突发故障率?
  • Redis 复制(replica)
  • Web前端 | HTML表单form
  • c语言中atoi函数用法以及功能
  • 卫星导航中DOP的简易数学科普
  • 尤菲·如月 与你有约 ぐりぐりキュートユフィ汉化补丁
  • 读零信任网络:在不可信网络中构建安全系统21读后总结与感想兼导读
  • 英语学习资源
  • sinon.js的spy、stub和mock
  • c++ 图形函数
  • 自学实践前后端项目4 MMall商城 6
  • 攻防世界-pwn-dice_game(srand(),rand(),随机数)
  • 盲打键盘的正确指法指南
  • 值得看的SQL书籍
  • R语言-knn算法的实现
  • Java/JDK下载安装与环境配置(Windows 10 超详细的图文版教程 )
  • 使用sourcesafe时遇到的问题
  • NationalInstruments(二)深圳市裕量科技有限公司
  • 支持 PS/2 与 USB 的键盘过滤驱动(可卸载)
  • ICE简介
  • CSV大表格分割难题解决,全靠这些软件!
  • 局域网限速工具幻境网盾使用教程
  • Leetcode 3 最长不重复字符串