DIY计算机必须掌握的知识点(1)——数制与编码
第一章 计算机逻辑电路基础
1.1 计算机中的数制与编码
一方面我们赞叹计算机的运算能力是多么强大,能处理多么复杂的数学计算;而另一方面我们又说计算机的智商是多么的低下,因为它只认识2个数:0和1。这样初学者往往会产生疑惑:用0和1怎样表示复杂的数字及怎样进行运算?
1.1.1 数制
十进制我们在各种数学计算中所用的传统的数制,它用十个阿拉伯符号“0~9”来表示数字“零~九”,大于“九”的数就不能用一位来表示了,必须进位,如它用“10”来表示“十”,用“100”表示“一百”,因此它的进位特点是:逢十进一。
二进制是计算机中所用的数制,它用两个阿拉伯符号“0和1”来表示数字“零和一”,大于“一”的数就不能用一位来表示了,必须进位,则它用“10”来表示“二”,用“100”表示“四”,因此它的进位特点是:逢二进一。
十六进制用十个阿拉伯符号和六个英文字母“0~9,A~F”来表示数字“零~十五”,大于“十五”的数据必须进位,则用“10”表示“十六”,用“100”表示“二百五十六”,因此它的进位特点是:逢十六进一。
任意一个数都可以用以上三种数制中的任一种来表示,一般地说,无论采用任种数制,任何一个数都可表示为:
在不同的数制中,式中基数“10”所表示的数值是不同的,在二进制中表示“二”;在十进制中表示“十”;在十六进制中表示“十六”。
式中Ki为基数“10”的第i次幂的系数,在二进制中可以是“0或1”;在十进制中可以是“0~9”;在十六进制中可以是“0~9,A~F”。
1.1.2 数制之间的转换
我们来规定一下以后的论述中数制的表示方法,用括号后的下标D、B和H分别表示十、二和十六进制数。例如(268)D表示十进制数;(1011001)B表示二进制数;(A8C7)H表示十六进制数。
1.二进制转换为十进制
可以先将二进制数按式2.1展开,然后将基数“10”换成十进制数“2”,再按十进制计算得到十进制数。
例如。
2.十进制转换为二进制
可以将十进制数分为整数和小数两个部分。将整数部分不断地除以2,把所得余数(只有0和1)按顺序从低(位0开始)到高位进行排列,直至商为0,所排列的余数即为所求二进制整数。例如(39)D转换为
则(39)D=(100111)B。
将十进制数的小数部分不断地乘以2,把所得乘积的整数部分(只有0和1)取出按顺序从高(位-1开始)到低位进行排列,直至误差满足要求。
3.二进制和十六进制之间的转换
由于16是2的4次幂,每4位二进制数对应1位十六进制数,因此它们之间的转换十分简单。将二进制整数部分从最低位开始每4位一组,不足4位的高位补0,然后将每组直接转换为十六进制即可。
例如 (11011011011010)B = (0011 0110 1101 1010)B = (36DA)H。
十六进制数向二进制数的转换也十分简单,只要将十六进制数的每一位直接转换为二进制数即可。
例如 (A 6F3)H = (1010 0110 1111 0011)B,因此可以说十六进制是二进制的缩写形式。
十六进制与十进制之间的转换可以参考二进制与十进制的转换。如十六进制转换为十进制,只要将“2”换成“16”,且将系数转换为十进制,再按十进制计算即可。
例如。
1.1.3 计算机的数据单位
在计算机中,常用的数据单位有位、字节、半字和字,微处理器根据位数的不同支持8位字节、16位半字或32位字的数据类型。
(1)位(bit):它是一个二进制数的位,位是是计算机数据的最小单位,一个位只有0和1 两种状态(21)。为了表示更多的信息,就必须将更多位组合起来使用,比如两位就有00、01、10、11四种状态(22),以此类推。
(2)字节(Byte): 通常将8位二进制作为一个字节,即1B=8bit,那么一个字节就可以表示0-255种状态或一个字节或十六进制数的0-FF之间的数,8位微处理器的数据是以字节方式存储的。
(3)半字:从偶数地址开始连续的2个字节构成一个半字,半字的数据类型为2个连续的字节,有些32位微处理器的数据是以半字方式存储的,比如32位ARM微处理器支持的Thumb指令的长度就刚好是一个半字。
(4)字:以能被4整除的地址开始的连续的4个字节构成1个字,字的数据类型为4个连续的字节,32位微处理器的数据全部支持以字方式存储的格式,比如32位ARM微处理器支持的ARM指令的长度就刚好是一个字。
1.1.4 二进制的算术运算
1. 加法运算
计算机中有加法器,两个二进制数可以直接相加,加法规则是:
0+0=0,0+1=1,1+1=10
例如两个8位二进制数相加10010011 + 10111100 = 10111100,向高位的进位为1。
2. 减法运算
计算机中无减法,减法也是通过加法器完成的,这里引入补码的概念,可以举一个例子说明一下,指针式钟表,假设要将时钟从5点拨到2点,有2种拨发,一种是逆时钟拨3个时格,相当于5减3等于2;另一个拨发是顺时针拨9个时格,相当于5加9等于2,这样以来可以说对时钟这种模式为12计数制来说,9和3互补,9是3的补码,反之依然。对于刚才时钟拔法我们可以写出如下算式:
5-3 = 5-(12-9) = 5+9-12 = 2
一个n位二进制数原码N,它的补码可定义为 (N)补=2n-N。
补码的概念是为了方便计算机做减法运算方便而引入的,因此二进制正数不用关心它的补码;而二进制负数的补码,为它的原码按位取反加1。
例如,8位二进制数 (-1)补= (11111110 + 1)B = (11111111)B。
在计算机中负数是用它的补码来表示的。用补码做减法运算很方便,我们说数A减去数B等于数A加上数B的补码,且要舍去进位。
例如,计算8位二进制数减法
(58-39)D=(00111010-00100111)B=(00111010+11011001)B=(00010011)B=(19)D。
[
本帖最后由 老夫子 于 2009-6-3 17:51 编辑 ]