【数电】(一) 进制转换编码 原码,反码,补码

本章的思维导图:
在这里插入图片描述

前提知识

要了解什么是进制编码,原码,反码,补码,那你就必须要了解计算机的发展史,以及计算机存储信息的方式

如果是有计算机基础的同学,或者对这部分知识已经有所了解,可以跳过此部分

计算机发展史

计算机(Computer)俗称电脑,是现代一种用于高速计算的电子计算机器,可以进行数值计算,又可以进行逻辑计算,还具有存储记忆功能。是能够按照程序运行,自动、高速处理海量数据的现代化智能电子设备。

计算机的发展经历了四代的演变,从1946年第一台电子计算机的诞生,到目前分别经历了

  • 第1代:电子管数字机(1946—1958年)
  • 第2代:晶体管数字机(1958—1964年)
  • 第3代:集成电路数字机(1964—1970年)
  • 第4代:大规模集成电路机(1970年到至今)

我们目前主要使用的计算机都是大规模集成电路机,是采用大规模和超大规模的集成电路作为逻辑元件的。

集成电路(Integrated Circuit)

集成电路,按其功能、结构的不同,可以分为三大类:

  • 模拟集成电路
  • 数字集成电路
  • 数/模混合集成电路

集成电路(Integrated Circuit)是一种微型电子器件或部件。采用一定的工艺,把一个电路中所需的晶体管、电阻、电容和电感等元件及布线互连一起,制作在一小块或几小块半导体晶片或介质基片上,然后封装在一个管壳内,成为具有所需电路功能的微型结构。

模拟集成电路又称线性电路,用来产生、放大和处理各种模拟信号指幅度随时间变化的信号。例如半导体收音机的音频信号、正弦波、三角波等),其输入信号和输出信号成比例关系。

1、模拟信号 : Analog Signal
在这里插入图片描述
2、数字信号 Digital Signal

数字集成电路用来产生、放大和处理各种数字信号指在时间上和幅度上离散取值的信号。例如3G手机、数码相机、电脑CPU、数字电视的逻辑控制和重放的音频信号和视频信号)。
在这里插入图片描述

也就是工科生经常听到以及学习的 模电数电

而我们的计算机主要是采用数字集成电路搭建的。

数字集成电路

用数字信号完成对数字量进行算术运算和逻辑运算的电路称为数字电路,或数字系统。由于它具有逻辑运算和逻辑处理功能,所以又称数字逻辑电路。

而数字电子技术中,我们使用低、高电平表示0、1两种逻辑状态 ( 也就是分别代表逻辑上的“真”与“假” 或 二进制当中的“1”和“0”) 从而实现逻辑运算。

在这里插入图片描述
常见的逻辑门包括“与”门,“或”门,“非”门,“异或”等等。逻辑门可以组合使用实现更为复杂的逻辑运算。
在这里插入图片描述

数字电路具有以下特点:

  • 1、同时具有算术运算和逻辑运算功能
    数字电路是以二进制逻辑代数为数学基础,使用二进制数字信号,既能进行算术运算又能方便地进行逻辑运算(与、或、非、判断、比较、处理等),因此极其适合于运算、比较、存储、传输、控制、决策等应用。
  • 2、实现简单,系统可靠
    以二进制作为基础的数字逻辑电路,可靠性较强。电源电压大小的波动对其没有影响,温度和工艺偏差对其工作的可靠性影响也比模拟电路小得多。
  • 3、集成度高,功能实现容易
    集成度高,体积小,功耗低是数字电路突出的优点之一。电路的设计、维修、维护灵活方便,随着集成电路技术的高速发展,数字逻辑电路的集成度越来越高。
    由于其具有以上特点,所以,数字电路与数字电子技术广
  • 4、具可编程性,可实现硬件设计软件化
  • 5、高速度 低功耗 加密性好

泛的应用于电视、雷达、通信、电子计算机、自动控制、航天等科学技术领域

此部分我们将在第二节中介绍

0 1思维

我们知道计算机的本质是数字集成电路,也就是晶体管, 而晶体管只能表示 高电平 真 低电平 假 两种状态
我们所看到的任何东西,计算机在真正运行时都要被转换成**二进制机器码(0/1)**才能够识别和运算

就好比老师让你回收到的时候会说 :同学们,懂得扣个1,不懂得扣个0
那这个1 和0 就是对数据的存储

二进制是计算机运行的基础

也就是: 计算机是用 0 1来存储数据的

1Bit

1Bit 也就是一个字节 是八位 也就是取值范围为 0000 0000~1111 1111

机器码

一个数在计算机中的二进制表示形式,叫做这个数的机器数。机器数是带符号的,在计算机用机器数的最高位存放符号,正数为0,负数为1。

比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是0000 0011。如果是 -3 ,就是 100 00011 。

那么,这里的 0000 0011 和 1000 0011 就是机器数。

加法器

计算机里面,只有加法器,没有减法器,也就是没有减法运算,所有的减法运算,都必须用加法进行。
即:减去某个数字(也就是相当于加上某个负数)的运算,都应该研究如何用加法来完成。

二进制与十进制之间的转换

二进制与十进制相信各位都有所了解了,所以这里我们只介绍其转换,而不介绍其概念,

1.十进制转二进制
方法为:十进制数除2取余法,即十进制数除2,余数为权位上的数,得到的商值继续除,直到商为0为止。
在这里插入图片描述
2**.二进制转十进制**
方法为:把二进制数按权展开、相加即得十进制数。
第几位二进制数就是二的几次方
在这里插入图片描述

BCD编码

BCD码也称二进码十进数,BCD码可分为有权码和无权码两类。常见的有权BCD码有8421码、2421码、5421码,无权BCD码有余3码、余3循环码、格雷码。

8421BCD码是最基本和最常用的BCD码,它和四位自然二进制码相似,它只选用了四位二进制码中前10组代码,即用0000···1001分别代表十进制数的0~9,余下的六组代码不用。

这里我们介绍下 8421码 5421 2421 和余3码

在这里插入图片描述
8421码

8421 BCD码是用四位二进制码来表示一位十进制数。但是只能表示0~9的十进制数。

 
如二进制的10010111BCD码转换成十进制是:97。

1001       0111
  9              7

十进制24 转换成8421码是: 00100100

2               4
0010       0100

原码,反码,补码

在了解了之前的知识以后,我们就要开始说 原码,反码,补码 这三个码了

原码

我们知道,计算机就是个会处理0 1的机器,别说是正负号的汉字了,据算是+ - 字符也是束手无策。

那怎么办呢?

那你既然知道0 和1 是啥 那咱们就规定一下吧 0就代表正数,1代表负数

原码定义: 将二进制数据的第一位用来表示正负 其余7位用来表示数值

[+1]原码 = 0 000 0001

[-1]原码 = 1 000 0001

在这里插入图片描述

第一位是符号位. 因为第一位是符号位, 所以8位二进制数的取值范围就是:

[1111 1111 , 0111 1111]==>[-127 , 127]

这样只会加法运算的计算机就可以做加减运算了 ,但是呢,这样子有个问题

我们希望 1-1 = 1 + (-1) = 0 ,
在这里插入图片描述

但计算机只能算出0001+1001=1010 (-2)

同时我们这里还有两个0 : +0 -0

在这里插入图片描述

于是呢,为了解决“正负相加等于0”的问题 反码 就出现了

反码

反码的表示方法是 :

  • 正数的反码是其本身
  • 负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.
[+1] = [00000001]= [00000001][-1] = [10000001]= [11111110]

在这里插入图片描述

这时我们发现 (+1)和(-1)相加,变成了0001+1101=1111,刚好反码表示方式中,1111象征-0

唯一的问题其实就出现在"0"这个特殊的数值上. 虽然人们理解上+0和-0是一样的, 但是0带符号是没有任何意义的. 而且会有[0000 0000]原和[1000 0000]原两个编码表示0.

我们希望只有一个0,所以发明了"补码"

补码

补码的表示方法是:

  • 正数的补码就是其本身
  • 负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
[+1] = [00000001]= [00000001]= [00000001][-1] = [10000001]= [11111110]= [11111111]

在这里插入图片描述

我们要处理"反码"中的"-0",当1111 1111再补上一个1之后,变成了1 0000 0000,丢掉最高位就是0000 0000,刚好就是左边正数的0,

虽然丢掉了 -0 但是我们得到了-8

这个时候

1-1 = 1 + (-1) = = [0000 0001]+ [1111 1111]= [0000 0000]=0

而且可以用[1000 0000]表示-128:

在用补码运算的结果中, [1000 0000]补 就是-128. 但是注意因为实际上是使用以前的-0的补码来表示-128, 所以 -128并没有原码和反码表示 .(对-128的补码表示[1000 0000]补算出来的原码是[0000 0000]原, 这是不正确的)

但是使用补码的方式,不仅仅修复了0的符号以及存在两个编码的问题, 而且还能够多表示一个最低数

对于8位二进制, 使用原码或反码表示的范围为[-127, +127], 而使用补码表示的范围为[-128, 127].

同时要记住一点:

正数的 原码,反码,补码 都是其本身

[+1] = [00000001]原 = [00000001]反 = [00000001]补




扩展讨论:

针对有计算机编程基础的同学:

我们再来讨论一下

学习过C语音或者其他语言的同学知道 字符型变量 的取值范围为[-128~127]

也就是 signed char的取值范围为-128 ~ 127

unsigned char 的取值范围为 0~255

到此时是你应该能明白,为什么是这样了

所有的C语言的书籍里都会告诉你signed char的取值范围为-128 ~ 127,但是从来没有人告诉你为什么会是这样;

我们先来算算,有符号的char占一个字节,最高位表示正负,其余的七位表示数值,七位二进制可以表示128个数(2^7 = 128),即0~127;加上符号位后,就变成了-127 ~ -0,0 ~127,这时,就会出现‘-0’这样一朵奇葩;

在学习了上面之后,你会了解到因为补码的存在,所以我们实际可以存储-128 ~ 127 但是在上方我们有说到 -128的反码和原码严格来讲是不存在的

我对网上关于-0和-128原码相同的这种说法表示很无语;

我们知道,计算机是以补码的形式存数据的;-0和-128在计算机中是怎样存的?

[-0] = [10000000]= [1111 1111]=[1000 0000 0][-128] =  [1000 0000]= 

-128 没有反码和原码

但是,我们的char类型是8位,因为存储是补码形式 所以便有了 -128 如果非要定义的话 可以吧-0的原码
[10000000]原 定义成-128的原码

终于可以不提‘-0’这个恶心的东西了,今后看到一个有符号的char,它的原码用二进制表示为1000 0000的时候,我们就把它当做-128就可以了(只是看做,-128的原码可不是1000 0000);

下面,我们来看一下这个程序:

#include <stdio.h>
int main(){
   char a = -129;
   printf("%d\n",a);
   return 0;
  }   

它会打印127,为什么?
-129 = -128 -1;因为计算机只会算加法,所以转换成
-128 + (-1)

-128    原码: 1000 0000   
           反码: 0111 1111  
     补码: 1000 0000
   
-1     原码: 1000 0001   
           反码: 1111 1110 
           补码: 1111 1111

    -128 + (-1)      
  1 0 0 0 0 0 0 0  
+ 1 1 1 1 1 1 1 1  
  ---------------------------   
  1 0 1 1 1 1 1 1 1
 
余出来的那个1 被舍弃 最后结果为 0 1 1 1 1 1 1 1 (-127)

因为a是一个char类型的,所以,会打印127, 由此我们可以推出在char的取值超出范围时的一些特征

这只是研究阶段,但请不要这样使用!

发布了72 篇原创文章 · 获赞 1244 · 访问量 25万+

猜你喜欢

转载自blog.csdn.net/as480133937/article/details/104501256