下列对象需要在计算机中表示:
程序
整数
浮点数
字符串
逻辑值:0表示假,1表示真。
在计算机中,编码的所有基本元素都由两个基本符号0和1表示,n位可以表示2 n个不同的对象。
00-1010逻辑数据
True-1
false-0
数据操作
结合
不可兼析取
不是操作
异或运算
00-1010很久以前,一群美国人开发了一台计算机,他们在计算机中发现,他们只需要8位二进制代码(一个字节)来表示世界上的一切(实际上,他们只使用了7位),2 7=128,他们使用这128位,从0到127,来存储数字和字母。这个代码是我们熟悉的Ascii代码。
但是世界上所有的国家都用电脑,但是他们不用中文。比如我们中国不用中文,所以这个时候中国开发了GB2312和GBK。目前其他国家也制定了符合本国国情的代码,所以这个时候就出现了一个问题,就是自己国家很流行,但是相互交流的时候就有麻烦。
因此,为了解决这个问题,国际标准化组织(ISO)这个标志标准组织着手解决这个问题。它们统一了标准,包含了所有国家的大多数字符。这个标准代码是unicode。当Unicode第一次公式化的时候,计算机的存储容量已经得到了很大的发展,所以它直接用16个字符来表示一个字符,所以2 ^ 16=65536总共可以表示这么多字符。它把整个编码空间分成块,每个块是16的倍数,然后分块进行。同时预留了6400个码点进行本地化。但是还是有一个问题,就是65536还是不够,因为这个世界上要表达的人物太多了。
随着计算机的发展,现在是64位。据说2.64可以代表地球上的每一粒沙子,所以问题很容易解决。就不能用64位来表示吗?
不过,这个时候还是有问题的。问题是以前ascii用7个字节来表示常用的数字和字母,所以现在用64位来表示是浪费空间。但是没有什么能打败科学家。科学家提出了UTF-8编码,这是一种可变长度的字符编码,可以提高存储空间的利用率。
首先,它通过第一个字节确定整个字符的长度,然后除了字符的第一个字节之外的所有字节都以“10”开头。这个代码功能强大,可以用7位而不是31位来表示,可以表示大量的字符而不会浪费太多的空间,所以可以用于互联网上的主导字符集。
如图所示,我们可以看到字节1第一位的识别字符位数。当为0时,表示7位数字;当它是110时,表示11位数字;那么字节1之后的所有字节都以10开始,这是它的格式。
字符通常用utf-8表示。现在我们来谈谈如何在计算机中存储数字数据。数字数据有两种:一种是定点数,另一种是浮点数。
定点有三种,一种是整数,一种是固定小数,一种是固定小数位置。
浮点数的一种是小数点位置的浮动。
下面我们分别对以上的几个对象进行简单的介绍
接下来,我们只介绍整数。要表示一个整数,我们首先需要确定数字系统。例如,在现实生活中,我们经常使用的数值是十进制,但在计算机中,我们使用二进制:
我们先来看看二进制和十进制之间的转换:
二进制到十进制
从十进制到二进制的转换
07d64407c4b?from=pc”>
把十进制数转换为二进制,对整数部分通过除2取余数来完成,对小数部分通过乘以2取整数来完成。
整数有正数和负数的区别,所以计算机中使用最高位来来表示正负数,其中0表示整数,1表示负数。其它位表示数据位,比如:
正数7,在计算机中用一个8位的二进制数来表示,是00000111,而负数-7,则用10000111表示
原码、反码、补码
原码
反码
补码
0000_0001
0000_0001
0000_0001
1000_0001
1111_1110
1111_1111
正数的原码、反码、补码是一样的,而负数的反码等于源码除符号位取反,补码等于反码在最低为加1。
这里就会产生两个问题,第一个问题,为什么需要有反码和补码,它的意思是什么?第二为什么整数的反码和补码和源码是一样的。
首先在计算机中我们需要进行加减运算,但是会有下面的几种情况出现
我们来看看如果直接使用原码进行加减是否可以?
1+(-1)=[0000_00001]+[1000_0001]=[1000_0010]=-2
我们可以看到正数相加的时候毫无问题,但是一旦出现负数的情况就完蛋了,我们可以看到1-1可以看成是1+(-1)结果确不等于0,而是等于-2,这显然不符合我们的逻辑。
那么我们不使用源码来表示了我们使用反码来计算,
-1的原码是[1000_0001]、反码[1111_1110]
2的源码是[0000_0010]、反码[0000_0010]
-1+2=[1111_1110]+[0000_0010]=[0000_0000]=0
我们发现这也不符合逻辑,-1+2应该等于0
那么下面我们再来使用补码来试一下:
-1的原码是[1000_0001]、反码[1111_1110]、补码[1111_1111]
2的源码是[0000_0010]、反码[0000_0010]、补码[0000_0010]
-1+2=[1111_1111]+[0000_0010]=[0000_0001]=1
我们发现这个是符号我们的逻辑的,所以回答第二个问题,为什么要有补码呢?这就是因为只有补码可以保证我们的加减运算是正确的,但是为什么会出现这种情况呢?
我们可以发现在负原码中每增加一个二进制单位对应的是递减的(1000_0001和1000——0000相比)按照道理来说1000_0001应该比1000_0000大,但是事实确相反,而正每增加一个二进制单位对应的真数是递增的,这个符合我们的需要,为了解决负数的这个问题,我们可以取反码
我们可以发现反码满足了负原码中每增加一个二进制单位对应的是递增的(1111_1110和1111_1111相比,1111_1111比1111_11110大),解决第一个问题之后,还有第二个问题,这个问题就是0的问题,因为没有正0和负零的说法,但是上面确有正零和负零区别,这就导致了重复的问题,这个时候我们发现当给负原码加1,那么0就统一了,如下所示:
那么问题就解决了,那么还需要注意的是1000_0000这个反码表示-128,所以补码的表示范围是[-128~127] ,这样一来256个二进制正好表示256个整数
计算机还有一种编码表示是检错纠错码
它能够使编码具有某种特征,通过检查这种特征是否存在来判断编码是否正确
码距的概念
码距是指任意两个合法码之间至少有几个二进制位不相同。
仅有一位不同的编码是无纠错能力的,例如用4位二进制表示16种状态,则16种编码都用到了,此时码距为1。任意一个编码状态的四位码中的一位或者几位出错,都会变成另外一个合法码,那么这种编码是没有检错能力的。
若用4个二进制位表示8种合法的状态,那么就可以只使用其中的8个编码来表示,另外8个为非法编码,那么合法的码距为2。因为此时任何一位出错后都会成为非法码,这样有检测一位出错的能力。
合理增大码距,那么就能提高错误的能力,但是会使用更多的二进制,增加了电子路线的复杂性和数据存储、数据传送的数量。
常用的检错纠错码有以下几种:
检错纠错过程如下:
先对原始数据使用校验码进行编码(加进特征),然后传输,传输完成之后进行译码,然后判断收到的码字是否有问题
下面我们讲解一下奇偶校验
原理是在k位数据码之外增加1位校验位,使得K+1位码字中取值1的位数总保持为偶数(偶效验)或奇数(寄校验),举一个例子:
对待传输数据10110110约定采用其校验时,发送方所需要发送的校验码为010110110,对于接收方来说,如果接收到的数据中’1’的个数不为奇数时,就会认为数据出错。但是它并不知道哪里出错了,也就是它没有纠错的能力。