对计算机编码的认识

来源:互联网 发布:扎克伯格娶丑女知乎 编辑:程序博客网 时间:2024/05/17 20:35
 

数学是事实的抽象,那么计算机就是数学的实现的实体。

突然想起计算机编码的问题,从学习计算机编码开始就不是太理解,昨天问了一位老师。好像明白了一些。和大家分享一下,

计算机是0、1的世界。那所有的东东都需要用0、1表示了。

是的,用0、1表示。那么很显然我们就会想到编码,即用不同的0、1 来表示不同的概念。

计算机的编码分为这样几个部分:

1:计算机内部的指令编码

2:对数据的编码(因为计算机要进行数学计算)

3:对文字编码(如对英语字母和汉字编码)

 

那对指令和文字的编码都比较简单,赋予他们不同的号即可。

 

我们在现实生活中,一些信息有语义。比如:10这个数字,可以表示十元钱,也可以表示一个小孩10岁等等语义。

那用数字表示一些事情就需要我们给赋予一定的语义。

 

对不同的指令和文字的编码做不同的编号并且赋予他们不同的语义就实现了信息的存储和输出。(像ascii码)

 

比较难于理解的是对数字的编码,因为数字需要运算,就是加 减 乘 除。

 

这样,问题就来了,我们平时的计算是十进制的且有了正负的运算。

而计算机内部是二进制的。不过进制只是对数据处理的方式不同罢了,并没有本质的区别。

那我们要解决的问题是正负数的问题。出现负数是因为人们想表达欠的意思,即差多少。

 

好了,下面说一下“补”的意思。比如说一个手表,现在时针指在12点的位置。想要调成11点,有两种方法。顺时针调11格,或者逆时针调1格。因为手表是一个有穷的环(离散数学里的概念)。即走完一周后会自动丢失原来已经走完的路程。

好了,有了补的概念后,既可以把减法变成加法了。因为只是表达方式的改变,一种说有多少,另一种说差多少。整体说的是一个概念。但这是有条件的,即有最大的限度。叫做模。如果最大的模是12.那么-5  和7的概念是一样的。还是想象成手表,顺时针走7格和逆时针走5格会在同一位置。那么6-5 在这种情况下就等同于6+7。想象手表,13不存在,最大是12,走了一周多了1格。就是1。

好了,如果有了模的限制,那减法就能用加法实现。而计算机就是有这样一个模。大家想一想,真正的硬件算术肯定是有限制的,无穷大在计算机里是无法用硬件实现的。因为没有办法真正存储这么一个无穷大的数据。也没有实际意义嘛。计算机里计数有位数的限制。假如你用的存数的东东最多只能装8位数。那最多11111111再加1 成了0000000000  。因为超出了模。8位存储空间就有256种状态。我们又想即表示正数又表示负数。而负数就用补得概念来做。那么计算机的运算部件就只考虑加法且不用考虑正负的问题。只不过,在我们程序员看来在逻辑上的区分。想一想手表,本来就12个格,一直顺时针走,肯定能实现所有的状态,我们逻辑上规定一下,0~5表示0和正数。而6~11表示-1~16不就好了。本来负数就是我们对数赋予的新的语义。我们逻辑上一规定,其实就是对计算机所能表示的状态进行了编码。只不过这种编码是符合离散数学理论的。有关域 环的概念请参考离散数学的相关书籍。

好了,那给出一个数,怎么求补码那,很简单,就是用模来减给出负数的绝对值。

例如:模是12   。-5的补码=12=|-5|=7

这样其实已经简化了计算了。但是求补码时又要用到减法,这好像有点说不过去。对,计算机肯定不是这么干的(其实是人不是这么设计的,嘿嘿)。大家看二进制的减法,以8位数为例。

例如求-2的补码:

用2^8-|-2|

11111111这个数是比模小一的数。那么模就是2^8

我们先用11111111做被减数

   11111111

-  00000010

   000000 01

然后结果再加一:

1111110

得到的就是-2的补码

嘿嘿 看这个过程其实就是把原来的数取反然后再加一。

呵呵,设计者就是这么干的。

为了简化硬件,所以求一个负数的补码就是先 取反再加一。

总结一下,为了简化硬件设计,我们把减法根据数学理论改成了加法,出现了补码的概念。然后,求补码又用取反加一的方法。好了,对大师们真的很佩服。膜拜一下。

这就是整个计算机的编码。