C程序设计 - 创新方法 何勤 2010.7.3 - 图文

发布时间 : 星期一 文章C程序设计 - 创新方法 何勤 2010.7.3 - 图文更新完毕开始阅读

编程的核心奥秘 何勤

1.通过三套总线,命令内存,把指定地址存储单元中的(炒菜过程马上要用到的)数据,送到中央处理单元中(的某个寄存器)来——即取数据; 2.命令运算器按照指令的要求,对数据(做“炒”,“蒸”,“煮”等基本操作步骤中的一个炒菜动作)作一次基本运算——即数据处理。

3.通过向三套总线向内存发命令,把某个寄存器中的运算结果(或中间运算结果)送回到内存中(由内存地址)指定的存储单元中存放——即保存结果; 4.根据某个状态寄存器中的某个具体值(比如上一条指令的运算结果为零),不按正常顺序取出并且执行下一条指令,而是根据此指令中给出的(内存的)地址,跳转到那一存储单元中,去取下一条指令——即进行跳转。

5.在中央处理单元的各个寄存器之间传送数据——在中央处理单元内部进行数据传送(移动) ;

6.命令输出设备输出一个数据(在本章不讨论,见第9章); 7.命令输入设备输入一个数据(在本章不讨论,见第9章);

一条指令运行完后,中央处理单元立即自动进行下一个形式完全相同的、新的取指令——执行指令的周期。 反复、自动进行的取指令——执行指令周期,是计算机进行各种数据处理工作中的核心...........操作(就象反复、自动进行的心脏搏动周期,是人体进行各种活动的核心运动)。 注意: 我们暂不考虑如何从外部输入程序和数据到计算机系统的内存中,也暂不考虑如何..从计算机系统的的内存中输出信息到系统外部的问题。这些重要而又比较复杂的问题,请参..见第12章。

1.5二进制及相关知识简介:

虽然理论上可以使用任何进制(比如十进制)为基础来制造计算机,但现代计算机全部都是采用二进制的电子数字信号进行工作的机器。也就是说,在计算机的内部,实际上都只能以二进制的数或码的形式来存放、传输、运行程序的指令和任何需要加工的数据的。 为了从底层真正理解计算机的工作原理,读者必须对二进制有所了解。以下简要介绍相关知识。

1.5.1 二进制数的概念

首先,来看一张部分十进制数与二进制数的数值对照表:

十进制数 所对应的二进制数

0 0 1 1 2 10 3 11 4 100 5 101 6 110 7 111 8 1000

17

编程的核心奥秘 何勤

9 1001 10 1010 11 1011 12 1100 13 1101 14 1110 15 1111

表 1.2 部分十进制数与二进制数的数值对照表

n

一般情况下,用n位二进制,可表示的最大正整数值是2-1。比如4位二进制可表示的

4

最大正整数是2-1=15(即1111)2 。

可见,二进制只能用两个数字“0”和“1”来进行计数(或表示各种不同状态)。二进制加法运算的重要规则是: 1+1=10 ,即两个1相加产生向高位的进位。左边是高位数,右边是低位数(此外,加法规则还有:1+0=1、0+1=0、0+0=0)。

我们用一对圆括号括住一个数值,并在圆括号外面加一个数字下标,来表示一个数是几进制数:

比如(1011)10是一个十进制数;而(1011)2是一个二进制数。 1.5.1将二进制整数转化成十进制整数

一个十进制的数,其数值可用以下展开式来表示:比如3785

3210

(3785)10=3×10+7×10+8×10+5×10 (1)

我们把(1)式中10的几次方称为权重,权重左边的乘数称为系数。(1)式中共有4....个系数,从左到右依次是:“3”“7”“8”“5”。可见,在数值数据中,越左边的数字(系数)权重越大。

类似的,一个二进制数,其数值也可用以下展开式来表示:比如二进制数1011 (1011)2= 1×23+0×22+1×21 +1×20 (2)

此二进制数的值,等于十进制的1×8+0×4+1×2+1×1=8+2+1=(11)10 (3)

由此可以得到:

二进制整数转化成十进制整数的一般方法:只要将该二进制整数(即1011)展开后的(2)式中的每一位的系数值,乘以这一位的转化成十进制数后的权重(即2的几次方),然后再...........将逐个乘积项的数值相加起来即可。

练习1:将二进制数 11010010转换成十进制。

1.5.2 将十进制整数转化成二进制数:

现在再来考查十进制数11,从上一小节的(2)式我们知道:

18

编程的核心奥秘 何勤

(11)10=1×23+0×22+1×21+1×20 (4)

将这个等式两边都整除2,等式将变为(5),余数为。这个1就是转化成2进制数后...1.的最低位(即最右边位)的值(注意,此数正好是等式(4)的最低位中的系数)。 5=1×22+0×21+1 ×20 (5)

继续再将(5)这个等式两边都整除2,等式变为(6),余数为,这个1就是十进制...1.数11转化成2进制数后的次低位的值(注意,此数正好是等式(5)的最低位中的系数)。

10

2=1×2+0 ×2 (6)

继续再将(6)这个等式两边都整除2,等式变为(7),余数为,这个0就是十进制...0.数11转化成2进制数后的从右边数第3低位的值(注意,此数正好是等式(6)的最低位的系数)。

1=1×20 (7)

继续再将(7)这个等式两边都整除以2,等式变为(8),余数为,这个1就是十进...1.制数11转化成2进制数后的从右边数第4位的值(注意,此数正好是等式(7)的最低位的系数)。

0=0 (5)

至此,十进制数11转换成二进制数的过程已经结束,答案是等于二进制的1011 。 实际上,将十进制数11,转换成二进制数1011之前,我们是不会得到等式(4)右边式子的。写出这些式子是为了揭示出数制转换过程中的奥秘。

我们在实际的十进制数转换成二进制数过程中,只要不停地用2除,不断地将得到的余数(不是1就是0)由低位到高位(就是说,按从右到左的顺序)逐个书写出来即可。直到此十进数的商最终成为0时,转换过程才告结束。

由以上讨论。可以得到:

将十进制整数转化成二进制数的一般方法——短除法:上述这种10——2进制数的转换方法,被变形为一种更为直接的短除法: 1. 将十进制数转换成二进制数的短除法:

短除法把要转换的数字不断的除以2然后取余数,商为0的时候结束。然后把余数倒着..写出来。

例如: 把84转换成二进制数

84 2

42 2

21 2

10 2

2 5 2 2

2 1 0

即: (84)10= (1010100)2

0 0 1 0 1 0 1

19

编程的核心奥秘 何勤

注意:短除法实际上适用于将一个十进制整数转换为一个任意n(n>2)进制的整数,只需将除...........................................数变为即可(参见第 讲)。 .2...n.......... 练习1:查阅参考书(比如任何一本《计算机导论》或《大学计算机基础》),看看十进制的纯小数是如何转化为二进制的纯小数的。

1.6数和码的区别:

1.6.1十进制的数和码:

十进制数3785和十进制码3785的区别:

如果3785用于表示数,则越高位(即越左边的位)的数字越重要(因为权重越大,在

30

十进制数3785中,“3”的权重是10,而“5”的权重是10)。

而3785用于表示非数值的码,则每一位都同样重要。对于数来说,3785与3786的取值差不多大(你可以说3785约等于三千七百,但你决对不可以说,3785约等于八十五)。但如果3785和3786是用来作为汉字编码的话,那就可以表示两个意义完全不同的汉字。例如:3785可以表示“我”字,而3786则可以表示“你”字。

所以,当我们看到由多个十进制数字构成的一个数字串时,如果我们不知道它的含义到...底是数还是码。在这种情况下,我们把它称为一个“数字串”。例如十进制的数字串3785...由四位十进制数字“3”、“7”、“8”、“5”组成。它既可以表示一个十进制的数值三千七百八十五,也可以表示码为3785的一个汉字(或者表示别的什么10000个同类事物或状态中的,编码为3785的一个特定事物或状态)。

1.6.2二进制的数和码:

与十进制一样,二进制数和二进制码也有类似的区别。只不过在二进制中只能用0和1组成的一个二进制“位串”来构成任何大小的数值或者表示具有任何含义的码。

换句话说,某个特定的8位二进制位串,例如:(01100001)2 既可以表示一个无符号的二进制数值——其数值等于(97)10 ;也可以表示某种编码方式下的一个码。因为编码方式是无限的,所以二进制码(01100001)2 所表示的含义可以是无限的(既可以代表某个具有256种不同颜色的调色板中的第97种颜色;也可以表示256个工种中的第97号工种等等)。除非已经指明了是采用何种编码方式。

深入一步: 数和码之间的复杂关系 当然,对数值数据本身也还是可进行编码的。比如对于一个二进制的有符号整数,由于在计算机中,也只能用二进制的一个位来表示此数的正负号,因此也有多种编码方式。常用的有原码、反码、补码这三种编码方式,来表示有符号的二进制整数。其中补码被当今大多数计算机采用(参见第3章)。 与表示非数值的事物(或状态)的编码不一样,对于数值数据的编码(比如补码),位串中的每一个?位?的重要性(与权重相关)是不一样的。 再比如,对一批数值数据进行压缩和解压,其实通常也是一种多对少的编码和少对多的解码。 20

联系合同范文客服:xxxxx#qq.com(#替换为@)