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

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

目录

一、基础知识补充

   (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.lryc.cn/news/2416880.html

相关文章:

  • android 电池监测工具,安卓最强电池监控器Battery Monitor Widget Pro
  • Android常用颜色对照表
  • 刚用uiotos交付了智慧园区统一管理平台,前端零代码+后端零代码+物联网平台,完美搭配!(一)|零代码、0代码、无代码、低代码、可视化编程、nodered、amis、codewave、乐吾乐
  • java编程思想第四版电子书,,终于有人把Java程序员必学知识点全整理出来了
  • 在Cocos2d-x中使用CocosBuilder
  • Windows版Redis和Redis Desktop Manager安装
  • 怎么测试网站服务器速度,怎么测试网站速度
  • Linux 系统日志文件有哪些类型?
  • MFC中的CMenu---如何动态添加菜单/菜单项、子菜单、右键菜单
  • GB2312汉字拼音对照表
  • 关于Wiki
  • 小熊工厂 bt
  • ssh连接报错: No route to host
  • 华大HC32F460的BOOT和IAP说明
  • 中国城市别名
  • HDMI 接口学习
  • M3U8在线播放
  • 《仙剑奇侠传》诗集
  • MySQL唯一值重复报错DuplicateKeyException最好解决方法ON DUPLICATE KEY UPDATE
  • linux编辑menu.lst,Windows下硬盘安装Ubuntu 16.04的menu.lst文件写法
  • Looper.prepare()和Looper.loop(),在子线程中更新UI
  • http://download.chinaitlab.com/
  • oracle 01157,Oracle数据库启动时出现ORA-01157和ORA-01110问题
  • 即将到来的 ECMAScript 2022 新特性
  • 窗口句柄浅析和获取窗口句柄的方法
  • Delphi7中WebBrowser控件的bug及解决方案
  • 硬盘显示容量和实际容量不符合_让小小白变大白的笔记本电脑知识科普(硬盘篇)...
  • 工具分享:易读文档下载器(同时支持百度/豆丁)
  • 在网页上漫步太空,谷歌推出谷歌天空网页版
  • 微信红包助手:自动抢红包,智能更轻松