02 2023 档案

摘要:C语言的特点 C语言是 AT&T 贝尔实验室的 D.M. Ritchie 在 1973 年推出的程序开发语言。C语言虽是高级编程语言,但它也具备了能够和汇编语言相媲美的低层处理(内存操作及位操作)功能。AT&T 贝尔实验室开发的 Unix,最初是用汇编语言编写的,但后来大部分都用C语言进行了重写。借 阅读全文
posted @ 2023-02-16 20:02 原魏薯片 阅读(26) 评论(1) 推荐(0) 编辑
摘要:人工智能是用计算机来实现人类智能的尝试。 阅读全文
posted @ 2023-02-16 17:04 原魏薯片 阅读(13) 评论(0) 推荐(0) 编辑
摘要:在该程序中,猜拳结果被保存在了计算机内部的内存中。而对手的出拳信息也通过2维数组"记录了下来。例如 player[0][0] 这个数组元素记录的就是对手出石头后再出石头的次数。数组的索引0、1、2 分别表示石头、剪刀、布。由于猜拳游戏刚开始时,数据记录还不够充足,因此这里使用了变量 counter 阅读全文
posted @ 2023-02-16 16:41 原魏薯片 阅读(25) 评论(0) 推荐(0) 编辑
摘要:随机数色子是用来产生随机数的一种工具,每个色子有20面。晃动随机数色子后,出现在正面的数字就是随机数。由于计算机没法去晃动随机数色子,因此程序一般会通过生成类似于随机数的数值公式来得到随机数。只需调用rand()函数,就可以得到结果(随机数)。由于借助公式产生的随机数具有一定的规律性,因此并不是真正 阅读全文
posted @ 2023-02-16 16:26 原魏薯片 阅读(60) 评论(0) 推荐(0) 编辑
摘要:代码清单12-2 阅读全文
posted @ 2023-02-16 16:10 原魏薯片 阅读(11) 评论(0) 推荐(0) 编辑
摘要:如何才能让计算机思考呢?我们一边用C语言制作《猜拳游戏》,一边来尝试各种思考方式。如果这个思考过程能直接用程序来表现的话,那么就能实现让计算机思考了(图12-2)。 该思考过程用程序来表示的话,就如代码清单2-1所示。 用随机数决定出拳的方式,同随意而定的思考方式是相同的。表12-1是该程序运行10 阅读全文
posted @ 2023-02-15 21:20 原魏薯片 阅读(16) 评论(0) 推荐(0) 编辑
摘要:程序就如同是由计算机执行的各种指令罗列起来的文章。计算机内部的CPU,通过对该文章的内容进行解析和运行,来控制连接到计算机的各种外围设备。具体来说,控制就是指CPU和各种设备之间配合进行数据的输入输出处理。 程序的使用目的大体可以划分为两类。一类是大家作为工具使用的程序。另外一个使用母的是用程序来代 阅读全文
posted @ 2023-02-15 21:04 原魏薯片 阅读(18) 评论(0) 推荐(0) 编辑
摘要:如果用一句话来简单地概括该机制,那就是显示器中显示的信息一直存储在某内存中。该内存称为VRAM(Video RAM)。在程序中,只要往VRAM中写入数据,该数据就会在显示器中显示出来。实现该功能的程序,是由操作系统或BIOS提供,并借助中断来进行处理的。 在MS-DOS时代,对大部分计算机来说,VR 阅读全文
posted @ 2023-02-15 20:56 原魏薯片 阅读(25) 评论(0) 推荐(0) 编辑
摘要:在了解 I/O 输入输出及中断处理的同时,还希望大家记住另外一个机制,这就是 DMA(Direct Memory Access )。DMA 是指在不通过 CPU 的情况下,外围设备直接和主内存进行数据传送。磁盘等都用到了这个 DMA机制。通过利用 DMA,大量数据就可以在短时间内转送到主内存。之所以 阅读全文
posted @ 2023-02-15 20:50 原魏薯片 阅读(18) 评论(0) 推荐(0) 编辑
摘要:由于外围设备有很多个,因此就有必要按照顺序来调查。按照顺序调查多个外围设备的状态称为轮询。对几乎不产生中断的系统来说,轮询是比较合适的处理。不过,对计算机来说就不适合了。举例来说,假如主程序正在调查是否有鼠标输人,这时如果发生了键盘输人的话,该如何处理呢?结果势必会导致键盘输入的文字无法实时地显示在 阅读全文
posted @ 2023-02-15 20:33 原魏薯片 阅读(18) 评论(0) 推荐(0) 编辑
摘要:IRQ是用来暂停当前正在运行的程序,并跳转到其他程序运行的必要机制。该机制称为中断处理。中断处理在硬件控制中担当着重要角色。因为如果没有中断处理,就有可能出现无法顺畅进行的情况。 从中断处理开始到请求中断的程序(中断处理程序)运行结束之前,被中断的程序(主程序)的处理是停止的。这种情况就类似于在处理 阅读全文
posted @ 2023-02-15 20:20 原魏薯片 阅读(36) 评论(0) 推荐(0) 编辑
摘要:由于用汇编语言编写程序比较麻烦,因此这里我们采取再C语言源代码中插入助记符的方式来实现。在大部分C语言的处理(编译器的种类)中,只要使用_asm{和}括起来,就可以在其中记述助记符。也就是说,这样可以编写C语言和汇编语言混合的源代码。这里我们使用微软的VisualC++来作成应用。 在 AT 兼容机 阅读全文
posted @ 2023-02-15 20:04 原魏薯片 阅读(40) 评论(0) 推荐(0) 编辑
摘要:Windows控制硬件时借助的是输入输出指令。其中具有代表性的两个输入输出指令就是IN和OUT。这些指令也是汇编语言的助记符。 IN指令和OUT指令的语法如图11-2所示。这是Pentium等x86系列CPU用的IN指令的语法。IN指令通过指定端口号的端口输入数据,并将其存储在CPU内部的寄存器中。 阅读全文
posted @ 2023-02-15 19:49 原魏薯片 阅读(318) 评论(0) 推荐(0) 编辑
摘要:在C语言等高级编程语言开发的Windows应用中,大家很少能接触到直接控制硬件的指令。这是因为硬件的控制是由Windows全权负责的。 不过,Windows提供了通过应用来间接控制硬件的方法。利用操作系统提供的系统调用功能就可以实现对硬件的控制。在Windows中,系统调用称为API(图11-1). 阅读全文
posted @ 2023-02-15 19:30 原魏薯片 阅读(21) 评论(0) 推荐(0) 编辑
摘要:在多线程处理中,用汇编语言记述的代码每运行1行,处理都有可能切换到其他线程(函数)中。因而,设 MyFuncl 函数在读出counter 的数值 100 后,还未来得及将它的2倍值 200写人 counter时,正巧 MyFunc2 函数读出了 counter的数值 100,那么结果就会导致 cou 阅读全文
posted @ 2023-02-14 21:40 原魏薯片 阅读(13) 评论(0) 推荐(0) 编辑
摘要:条件分支的实现方法同循环处理的实现方法类似,使用的也是cmp指令和跳转指令。 条件分支就是利用这些指令来实现的。代码清单10-11是,根据变量a的值来调用不同函数(MySub3函数)的从语言源代码。结果如代码清单10-12所示。 代码清单 10-12 中用到了三种跳转指令,分别是比较结果小时跳转的 阅读全文
posted @ 2023-02-14 21:33 原魏薯片 阅读(51) 评论(0) 推荐(0) 编辑
摘要:C语言程序的流程控制,代码清单10-8。 C语言的for语句是通过括号中指定循环计数器的初始值(i=0)、循环的继续条件(i<10)、循环计数器的更新(i++)这3种形式来进行循环处理的。与此同对,在汇编语言的源代码中,循环通过比较指令(cmp)和跳转指令(jl来实现)。 代码清单10-10是按照代 阅读全文
posted @ 2023-02-14 21:12 原魏薯片 阅读(19) 评论(0) 推荐(0) 编辑
摘要:在代码清单10-6中定义了10个局部变量。这是为了表示存储局部变量的不仅仅是栈,还是寄存器。为了确保c1~c10所需的领域,寄存器空闲时就使用寄存器,寄存器空间不足就使用栈。 x86 系列 CPU拥有的寄存器中,程序可以操作的有十几个。其中空闲的,最多也只有几个。因而,局部变量数目很多的时候,可分配 阅读全文
posted @ 2023-02-14 21:01 原魏薯片 阅读(18) 评论(0) 推荐(0) 编辑
摘要:C语言中,在函数外部定义的变量 称为全局变量,在函数内部定义的变量称为局部变量。 代码清单10-6的C语言源代码中定义了初始化(设定了初始值)的a1~a5这5个全局变量,以及没有初始化(没有设定初始值)的b1~b5这5个全局变量,此外还定义了c1~c10这10个局部变量,且分别给 各变量赋了值。 将 阅读全文
posted @ 2023-02-14 20:53 原魏薯片 阅读(20) 评论(0) 推荐(0) 编辑
摘要:ebp 寄存器的值在(1)中人栈,在(5)中出栈。这主要是为了把函数中用到的 ebp 寄存器的内容,恢复到函数调用前的状态。在进入函数处理之前,无法确定 ebp 寄存器用到了什么地方,但由于函数内部也会用到 ebp 寄存器,所以就暂时将该值保存了起来。CPU 拥有的寄存器是有数量限制的。在函数调用前 阅读全文
posted @ 2023-02-14 20:41 原魏薯片 阅读(14) 评论(0) 推荐(0) 编辑
摘要:代码清单 10-1 中列出的C语言源代码中,有一个处理是在变量c中存储 AddNum 函数的返回值,不过在汇编语言的源代码中,并没有与此对应的处理。这是因为编译器有最优化功能。最优化功能是编译器在本地代码上费尽功夫实现的,其目的是让编译后的程序运行速度更快、文件更小。在代码清单 10-1 中,由于存 阅读全文
posted @ 2023-02-14 20:32 原魏薯片 阅读(11) 评论(0) 推荐(0) 编辑
摘要:数据在存储时是从内存的下层(大的地址编号)逐渐往上层(小的地址编号)累积,读出时则是按照从上往下的顺序进行(图10-3)的。 栈是存储临时数据的区域,它的特点是通过 push 指令和 pop指令进行数据的存储和读出。往栈中存储数据称为“人栈”,从栈中读出数据称为“出栈”。32位x86系列的CPU中, 阅读全文
posted @ 2023-02-14 20:00 原魏薯片 阅读(125) 评论(0) 推荐(0) 编辑
摘要:指令中最常使用的是对寄存器和内存进行数据存储的 mov 指令。mov 指令的两个操作数,分别用来指定数据的存储地和读出源。操作数中可以指定寄存器、常数、标签(附加在地址前),以及用方括号()围起来的这些内容。如果指定了没有用方括号围起来的内容,就表示对该值进行处理:如果指定了用方括号围起来的内容,方 阅读全文
posted @ 2023-02-14 19:40 原魏薯片 阅读(230) 评论(0) 推荐(0) 编辑
摘要:在汇编语言中,1行表示对CPU的一个指令。汇编语言指令的语法结构是操作码+操作数(也存在只有操作码没有操作数的指令)。 能够使用任何形式的操作码,是由CPU的种类决定的。表10-1对代码清单10-2中用到的操作码的功能进行了整理。 本地代码加载到内存才能运行。 寄存器是CPU中的存储区域。不过,寄存 阅读全文
posted @ 2023-02-14 19:37 原魏薯片 阅读(26) 评论(0) 推荐(0) 编辑
摘要:汇编语言的源代码,是由转换成本地代码的指令(即操作码)和针对汇编器的伪指令构成的。伪指令负责把程序的构造及汇编的方法指示给汇编器(转换程序)。伪指令本身是无法汇编转换成本地代码的。这里我们把代码清单10-2中用到的伪指令部分摘出,如代码清单10-3所示。 由伪指令 segment和ends围起来的部 阅读全文
posted @ 2023-02-14 18:55 原魏薯片 阅读(16) 评论(0) 推荐(0) 编辑
摘要:除了将本地代码进行反汇编这一方法外,通过其他方式也可以获取汇编语言的源代码。大部分C语言编译器,都可以把利用C语言编写的源代码转换成汇编语言的源代码,而不是本地代码。利用该功能,就可以对C语言的源代码和汇编语言的源代码进行比较研究。笔者在学生时代的报告中,使用的便是该功能。Borland C++ 中 阅读全文
posted @ 2023-02-13 21:48 原魏薯片 阅读(98) 评论(0) 推荐(0) 编辑
摘要:通过调查本地代码的内容,可以了解程序最终是以何种形式来运行的。但是,如果直接打开本地代码来看的话,只能看到数值的罗列。如果直接使用这些数值来编写程序的话,还真是不太容易理解。因而就产生了这样一种想法,那就是在各本地代码中,附带上表示其功能的英语单词缩写。例如,在加法运算的本地代码中加上add(add 阅读全文
posted @ 2023-02-13 21:40 原魏薯片 阅读(20) 评论(0) 推荐(0) 编辑
摘要:Windows操作系统的主要特征如下所示。 (1)32位操作系统(也有64位版本) (2)通过API函数集来提供系统调用 (3)提供采用了图形用户界面的用户界面 (4)通过WYSIWYG实现打印输出 (5)提供多任务功能 (6)提供网络功能及数据库功能 (7)通过即插即用实现设备驱动的自动设定 阅读全文
posted @ 2023-02-13 21:23 原魏薯片 阅读(38) 评论(0) 推荐(0) 编辑
摘要:通过使用操作系统提供的系统调用,程序员就没必要编写直接控 制硬件的程序了。而且,通过使用高级编程语言,有时甚至也无需考虑系统调用的存在。这是因为操作系统和高级编程语言能够使硬件抽象化。这是个非常了不起的处理。 下面就让我们来看一下硬件抽象化的具体实例。代码清单 9-2 是用 C语言编写的往文件中写人 阅读全文
posted @ 2023-02-13 21:11 原魏薯片 阅读(27) 评论(0) 推荐(0) 编辑
摘要:操作系统的硬件控制功能,通常是通过一些小的函数集合体的形式来提供的。这些函数及调用函数的行为统称为系统调用(systemcall),也就是应用对操作系统(svstem)的功能进行调用(call)的意思。在前面的程序中用到了 time()及 printf()等函数,这些函数内部也都使用了系统调用。这里 阅读全文
posted @ 2023-02-13 20:48 原魏薯片 阅读(24) 评论(0) 推荐(0) 编辑
摘要:代码清单9-1表示的是,在Windows操作系统下,用C语言制作一个具有表示当前时间时间功能的应用。time()是用来取得当前日期和时间的函数,print()是用来在显示器上显示字符串的函数。程序的运行结果如图9-4所示。 运行代码清单9-1的应用时,硬件的受控过程如下所示。 (1)通过time_t 阅读全文
posted @ 2023-02-13 20:30 原魏薯片 阅读(19) 评论(0) 推荐(0) 编辑
摘要:在计算机尚不存在操作系统的年代,完全没有任何程序,因此程序员就需要编写出处理相关的所有程序。用机器语言编写程序,然后再使用开关将程序输入,这一过程非常麻烦。于是,有人开发出了仅具有加载和运行功能的监控程序,这就是操作系统的原型。通过事先启动监控程序,程序员就可以根据需要将各种程序加载到内存中运行。虽 阅读全文
posted @ 2023-02-13 19:59 原魏薯片 阅读(21) 评论(0) 推荐(0) 编辑
摘要:Q:编译器和解释器有什么不同? A:编译器是在运行前对所有源代码进行解释处理的。而解释器则是在运行时对源代码的内容一行一行地进行解释处理的。 Q:“分割编译”指的是什么? A:将整个程序分为多个源代码来编写,然后分别进行编译,最后链接成一个 EXE 文件。这样每个源代码都相对变短,便于程序管理。Q 阅读全文
posted @ 2023-02-13 18:49 原魏薯片 阅读(15) 评论(0) 推荐(0) 编辑
摘要:EXE 文件的内容分为再配置信息、变量组和函数组,这一点想必大家都清楚了吧。不过,当程序加载到内存后,除此之外还会额外生成两个组,那就是栈和堆。栈是用来存储函数内部临时使用的变量(局部变量“),以及函数调用时所用的参数的内存区域。堆是用来存储程序运行时的任意数据及对象的内存领域(图 8-10)。 E 阅读全文
posted @ 2023-02-13 18:38 原魏薯片 阅读(14) 评论(0) 推荐(0) 编辑
摘要:在程序运行时,虚拟的内存地址会转换成实际的内存地址。链接器会在 EXE 文件的开头,追加转换内存地址所需的必要信息。这个信息称为再配置信息。 EXE 文件的再配置信息,就成为了变量和函数的相对地址。相对地址表示的是相对于基点地址的偏移量,也就是相对距离。实现相对地址,也是需要花费一番心思的。在源代码 阅读全文
posted @ 2023-02-13 18:11 原魏薯片 阅读(19) 评论(0) 推荐(0) 编辑
摘要:Windows 以函数的形式为应用提供了各种功能。这些形式的函数称为API(Application Programming Interface,应用程序接口)。 Windows 中,API的目标文件,并不是存储在通常的库文件中,而是存储在名为 DLL(Dynamic Link Library)文件的 阅读全文
posted @ 2023-02-13 16:31 原魏薯片 阅读(19) 评论(0) 推荐(0) 编辑
摘要:链接选项“-Tpe-c-x-aa”是指定生成 Windows 用的 EXE 文件的选项。在这些选项之后,会指定结合的目标文件。而该命令行中就指定了c0w32.obj、Samplel.obj 这两个目标文件,这点相信大家都能看得出来。Samplel.obj是Samplel.c 编译后得到的目标文件。c 阅读全文
posted @ 2023-02-13 16:21 原魏薯片 阅读(29) 评论(0) 推荐(0) 编辑
摘要:编译器转换源代码后,就会生成本地文件。不过,本地文件是无法直接运行的。为了得到可以运行的 EXE 文件,编译之后还需要进行“链接”处理。 Borland C++的编译器是 bcc32.exe 这个命令行工具。在 Windows的命令提示符"中,运行下列命令后,由C语言编写的源文件 Smaplel.c 阅读全文
posted @ 2023-02-13 15:52 原魏薯片 阅读(25) 评论(0) 推荐(0) 编辑
摘要:能够把C语言等高级编程语言编写的源代码转换成本地代码的程序称为编译器。每个编写源代码的编程语言都需要其专用的编译器。将C语言编写的源代码转换成本地代码的编译器称为C编译器。 编译器首先读入代码的内容,然后再把源代码转换成本地代码。编译器中就好像有一个源代码同本地代码的对应表。但实际上,仅仅靠对应表是 阅读全文
posted @ 2023-02-13 15:35 原魏薯片 阅读(26) 评论(0) 推荐(0) 编辑
摘要:Windows中EXE文件的程序内容,使用的就是本地代码。 用记事本打开有代码清单8-1的内容转换成本地代码得到的EXE文件(Samplel.exe),页面显示情况如图8-3所示。据此我们应该可以看出,本地代码内容是人类无法理解的。也正是因为如此,才有了用人类容易理解的C语言等编程语言来编写源代码, 阅读全文
posted @ 2023-02-13 15:23 原魏薯片 阅读(17) 评论(0) 推荐(0) 编辑
摘要:首先,看一下代码清单8-1。这是一个用C语言记述的Windows程序。该程序运行后,会把123和456的平均值289.5显示在消息框(图8-1)中。 类似于代码清单8-1这样,用某种编程语言的程序就称为源代码,保存源代码的文件称为源文件。用C语言编写的源文件的扩展名通常是“.c”,因此,这里我们就把 阅读全文
posted @ 2023-02-13 15:08 原魏薯片 阅读(19) 评论(0) 推荐(0) 编辑
摘要:程序的运行环境中,存在着名为BIOS(Basic Input/Output System)的系统。BIOS存储在ROM中,是预先内置在计算机主机内部的程序。BIOS除了键盘、磁盘、显卡等基本控制程序外,还有启动“引导程序”的功能。引导程序是存储在启动驱动器起始区域的小程序。操作系统的启动驱动器一般是 阅读全文
posted @ 2023-02-12 21:32 原魏薯片 阅读(154) 评论(0) 推荐(0) 编辑
摘要:除虚拟机的方法之外,还有一种方法能够提供不依赖于特定硬件及操作系统的程序运行环境,那就是Java。 大家说的Java,有两个层面的意思。一个是作为编程语言Java,另一个是作为程序运行环境的Java。同其他编程语言相同,Java也是将Java语法记述的源代码编译后运行。不过,编译后生成的并不是特定C 阅读全文
posted @ 2023-02-12 21:18 原魏薯片 阅读(15) 评论(0) 推荐(0) 编辑
摘要:即使不通过移植,也可以使用别的办法来进行其他操作系统的应用。通过利用虚拟机,我们就可以在Macintosh的Mac操作系统上运行Windows应用了。 Virtual PC for MAC可以使Macintosh这一硬件变得同AT兼容机一样,从而能在该硬件上安装Windows。这样一来,Window 阅读全文
posted @ 2023-02-12 20:58 原魏薯片 阅读(19) 评论(0) 推荐(0) 编辑
摘要:Unix系列操作系统FreeBSD中,存在一种名为Ports的机制。该机制能够结合当前运行的硬件环境来编译应用的源代码,进而得到可以运行的本地代码系统。如果目标应用的源代码没有在硬件上的话,Ports就会自动使用FTP连接到相关站点来下载(图7-5)。 全球很多站点都提供适用于FreeBSD的应用源 阅读全文
posted @ 2023-02-12 20:46 原魏薯片 阅读(40) 评论(0) 推荐(0) 编辑
摘要:应用软件则必须根据不同的操作系统类型来专门开发。CPU的类型不同,所对应的机器语言也不同,同样的道理,操作系统的类型不同,应用程序向操作系统传递指令的途径也是不同的。 应用程序像操作系统传递指令的途径称为AIP(Application Programming Interface)。Windows及U 阅读全文
posted @ 2023-02-12 20:32 原魏薯片 阅读(29) 评论(0) 推荐(0) 编辑
摘要:计算机的硬件并不仅仅是由 CPU构成的,还包括用于存储程序指令和数据的内存,以及通过 I/0连接的键盘、显示器、硬盘、打印机等外围设备。而计算机是如何控制这些外围设备的呢?这和计算机的机型有着很大的关系。 Windows操作系统对克服这些硬件构成的差异做出了很大贡献。Windows 的前身操作系统 阅读全文
posted @ 2023-02-12 20:06 原魏薯片 阅读(70) 评论(0) 推荐(0) 编辑
摘要:程序中包含着运行环境这一内容。可以看它的安装包或者目录。通常在某个位置会写有“运行环境”这一项。例如2007 Microsoft Office System需要的运行环境,就如表7-1所示。从中可以看出,在表示程序运行环境时,列出了Operating System(操作系统)和计算机的主机(硬件)两 阅读全文
posted @ 2023-02-12 19:41 原魏薯片 阅读(66) 评论(0) 推荐(0) 编辑
摘要:图像文件的使用目的通常把图像数据输出到显示器、打印机等设备上。Windws的标准图像形式为BMP,是完全未压缩的。由于显示器及打印机输出的bit(点)是可以直接映射(mapping)的,因此便有了BMP=bitmap这一名称。 除BMP格式以外,还有其他各种格式的图像数据形式。比如JPEG格式、TL 阅读全文
posted @ 2023-02-12 19:02 原魏薯片 阅读(194) 评论(0) 推荐(0) 编辑
摘要:通过前面我们看到的图6-5的步骤2可以发现,在用枝条连接数据时,我们是从出现频率较低的数据开始的,这就意味着出现频率越低 的数据到达根部的枝条就越多。而枝条越多,编码的位数也就随之增多了。 而从哈夫曼算法压缩过的文件中读取数据后,就会以位为单位对该数据进行排查,并与哈夫曼树进行比较看是否到达了目标编 阅读全文
posted @ 2023-02-12 18:42 原魏薯片 阅读(28) 评论(0) 推荐(0) 编辑
摘要:莫尔斯编码是根据日常文本中各字符出现频率决定表示各字符的编码的数据长度。不过,该编码体系,对AAAAAABBCDDEEEEEEF这样的特殊文并不是最合适的。在莫尔斯编码中,E的数据长度最短,而在AAAAAABBCDDEEEEEEF这个文本中,出现最频繁的是字符A。因此,应该给A分配数据长度最短的编码 阅读全文
posted @ 2023-02-12 18:29 原魏薯片 阅读(42) 评论(0) 推荐(0) 编辑
摘要:哈夫曼算法是哈夫曼(D.A.Huffman)于1952年提出来的压缩算法。日本人比较常用的压缩软件LHA,使用的就是哈夫曼算法。 文本文件是由不同类型的字符组合而成的,而且不同的字符出现的次数也是不同的。例如,在某以文本文件中,A出现了100次左右,Q仅用到了3次,类似这样的情况是很常见的。而哈夫曼 阅读全文
posted @ 2023-02-12 16:46 原魏薯片 阅读(56) 评论(0) 推荐(0) 编辑
摘要:在实际的文本文件中,同样字符多次重复出现的情况并不多见。虽然针对相同数据经常连续出现的图像、文件等,RLE算法可以发挥不错的效果,但它并不适合文本文件 的压缩。不过,因为该压缩机制非常简单,因此使用RLE算法的程序也相对更容易编写。笔者曾用自己做成的RLE算法压缩程序对各种类型的文件进行过压缩,其结 阅读全文
posted @ 2023-02-12 16:24 原魏薯片 阅读(27) 评论(0) 推荐(0) 编辑
摘要:由于半角字母中,1个字符是作为1个字节的数据被保存在文件中的,因此上述文件的大小就是17个字节。我们可以使用方式来压缩。 把文件内容用“数据x重复次数”的形式来表示的压缩方法称为RLE(Run Length Encoding,行程长度编码)算法(图6-2)。RLE算法是一种很好的压缩方法,经常被用于 阅读全文
posted @ 2023-02-12 16:02 原魏薯片 阅读(32) 评论(0) 推荐(0) 编辑
摘要:文件是将数据存储在磁盘等存储媒介中的一种形式。程序文件中存储数据的单位是字节。 文件就是字节数据的集合。用1字节(=8位)表示字节数据有256种,用二进制数来表示的话,其范围就是00000000~11111111。如果文件中存储的数据是文字,那么该文件就是文本文件。如果是图形那么该文件就是图像文件。 阅读全文
posted @ 2023-02-12 15:53 原魏薯片 阅读(130) 评论(0) 推荐(0) 编辑
摘要:磁盘是通过把其物理表面划分成多个空间来使用的。划分的方式有扇区方式和可变长方式两种,前者是将磁盘划分为固定长度的空间,后者则是把磁盘划分为长度可变的空间。一般的Windows计算机所使用的硬盘和软盘,采用的都是扇区方式。扇区方式中,把磁盘表面分成若干个同心圆的空间就是磁道,把磁道按照固定大小(能存储 阅读全文
posted @ 2023-02-11 20:52 原魏薯片 阅读(52) 评论(0) 推荐(0) 编辑
摘要:以图形用户界面(GUI,Graphical User Interface)为基础的Wi你都我是,可以说是一个巨大的操作系统。 (1)通过DLL文件实现函数共有 DLL(Dynamic Link Library)文件,顾名思义,是在程序运行时可以动态加载Library(函数和数据的集合)的文件。多个应 阅读全文
posted @ 2023-02-11 20:38 原魏薯片 阅读(36) 评论(0) 推荐(0) 编辑
摘要:虚拟内存是指把磁盘的一部分作为假想的内存来使用。这与磁盘缓存是假想的磁盘(实际上是内存)相对,虚拟内存是假想的内存(实际上是磁盘)。 通过借助虚拟内存,在内存不足时也可以运行程序。虚拟内存虽说是把磁盘作为内存的一部分来使用,但实际上正在运行的程序部分,在这个时间点上是必须存在在内存中的。也就是说,为 阅读全文
posted @ 2023-02-11 20:12 原魏薯片 阅读(62) 评论(0) 推荐(0) 编辑
摘要:磁盘缓存指的是把从磁盘中读出的数据存储到内存空间中的方式。这样一来,当接下来需要读取同一数据时,就不用通过实际的磁盘,而是从磁盘缓存中把内容读出。使用磁盘缓存可以大大改善磁盘数据的访问问速度(图5-2)。 把低速设备的数据保存在高速设备中,需要时可以直接将其从告诉设备中读出,这种缓存的方式在其他情况 阅读全文
posted @ 2023-02-11 19:45 原魏薯片 阅读(14) 评论(0) 推荐(0) 编辑
摘要:程序保存在存储设备中,通过有序地被读出来实现运行,这一机制称为存储程序方式(程序内置方式)。 计算机中主要的存储部件是内存和磁盘。磁盘中存储的程序,必须要加载到内存后才能运行。在磁盘中保存的原始程序是无法直接运行的。这是因为,负责解析和运行程序内容的CPU,需要通过内部程序计数器来指定内存地址,然后 阅读全文
posted @ 2023-02-10 21:26 原魏薯片 阅读(32) 评论(0) 推荐(0) 编辑
摘要:二叉查找树是指在链表的基础上往数组中 追加元素时,考虑到数据大小关系,将其分成左右两个方向的表现形式。例如,假设我们事先把50这个值保存到了数组中。那么,如果接下来的值比先前保存的数值大的话,就要将其放到右边,反之如果小的话就放在左边。但实际的内存并不会分成两个方向,这是在程序逻辑上实现的(图4-1 阅读全文
posted @ 2023-02-10 20:51 原魏薯片 阅读(20) 评论(0) 推荐(0) 编辑
摘要:通过使用链表,可以更加高效地对数组数据(元素)进行追加和删除处理。而通过使用二叉查找树,则可以更加高效地对数组 进行检索。 在数组的各个元素中,除了数据值之外,通过为其附带上下一个元素的索引,即可实现链表。数据的值和下一个元素的索引组合在一起,就构成了数组的一个元素。这样,数组元素相连就构成了念珠似 阅读全文
posted @ 2023-02-10 20:40 原魏薯片 阅读(14) 评论(0) 推荐(0) 编辑
摘要:栈、队列,都可以不通过指定地址和索引来对数组的元素进行读写。需要临时的保存计算过程中的数据、连接在计算机上的设备或者输入输出的数据时,都可以通过这些方法来使用内存。如果每次保存临时数据都需要指定地址和索引,程序就会变得比较麻烦,因此要加以改进。 栈和队列的区别在于数据出入的顺序不同。在对内存数据进行 阅读全文
posted @ 2023-02-10 20:32 原魏薯片 阅读(39) 评论(0) 推荐(0) 编辑
摘要:数组是指多个同样数据类型的数据在内存中连续排列的形式。作为数组元素的各个数据会通过连续的编号被区分开来,这个编号称为索引(index)。指定索引后,就可以对该索引所对应地址的内存进行读写操作。而索引和内存地址的变换工作则是由编译器自动实现的。 代码点歌单4-3表示的是在C语言中定义char类型、sh 阅读全文
posted @ 2023-02-10 20:00 原魏薯片 阅读(18) 评论(0) 推荐(0) 编辑
摘要:指针是C语言的重要特征。指针也是一种变量,他所表示的不是数据值,而是存储着数据的内存地址。通过使用指针,就可以对任意指定地址的数据进行读写。在Windows计算机上使用的程序通常都是32位(4字节)的内存地址。这种情况下,指针变量的长度也是32位。 代码清单4-2,这是定义了d、e、f这三个指针变量 阅读全文
posted @ 2023-02-10 16:57 原魏薯片 阅读(16) 评论(0) 推荐(0) 编辑
摘要:虽然内存的实体是内存IC,不过从程序员的角度来看,也可以把它假想成每层都存储着数据的楼房,并不需要过多地关注内存IC的电源和控制信号等。因此,之后的讲解中我们也同样会使用楼房图(或者与楼房相似的图)。内存为1KB时,表示的是如图4-3所示的有1024层的楼房(这里地址的值是从上往下逐渐变大,不过也有 阅读全文
posted @ 2023-02-10 16:25 原魏薯片 阅读(15) 评论(0) 推荐(0) 编辑
摘要:内存实际上是一种名为内存IC的电子元件。虽然内存IC包括DRAM、SRAM、ROM等多种形式,但从外部来看,基本机制都是一样的。内存IC中有电源、地址信号、数据信号、控制信号等用于输入输出的大量引脚(IC引脚),通过为其指定地址(address),来进行数据的读写。 图4-1是内存IC(在这里假设它 阅读全文
posted @ 2023-02-10 16:03 原魏薯片 阅读(33) 评论(0) 推荐(0) 编辑
摘要:二进制数和十六进制数的关系。在以单位表示数据时,使用二进制数很方便,但如果位数太多,看起来就比较麻烦。因此,在实际程序中,也经常会用十六进制数来代替二进制数。在C语言程序中,只需在数值的开头加上0x(0和x)就可以表示十六进制数。 二进制数的4位,正好相当于十六进制的一位。用十六进制来表示二进制小数 阅读全文
posted @ 2023-02-09 22:20 原魏薯片 阅读(53) 评论(0) 推荐(0) 编辑
摘要:计算机计算出错有两种避免该问题的方法: 首先是回避策略,即无视这些错误。根据程序目的的不同,有时一些微小的偏差并不会造成什么问题。一般来讲,在科学技术计算领域,计算机的计算结果只要能得到近似值就足够了。那些微小差完全可以忽略掉。 另一个策略是把小数转换成整数来计算。计算机在进行小数计算时可能会出错, 阅读全文
posted @ 2023-02-09 22:11 原魏薯片 阅读(136) 评论(0) 推荐(0) 编辑
摘要:通过上面几节我们不能仅仅读一遍就能理解,而是要从实际程序中加以确认。如代码清单3-2所示。如何用单精度浮点数来表示十进制数0.75。 该程序执行后,十进制数0.75用单精度浮点数来表示就变成了0-01111110-1000000000000000000000(图3-7)。加破折号(-)是为了区分符号 阅读全文
posted @ 2023-02-09 21:32 原魏薯片 阅读(40) 评论(0) 推荐(0) 编辑
摘要:尾数部分使用正则表达式,可以将表现形式多样的浮点数统一为一种表现型时。例如,十进制数 0.75就有很多中表现形式,如图3-5所示。 单精度浮点数的正则表达式具体例子如图3-6所示。 指数部分中使用EXCESS系统,使用这种方法主要是为了表示负数时不使用符号位。在某种情况下,在指数部分,需要通过“负O 阅读全文
posted @ 2023-02-09 21:19 原魏薯片 阅读(42) 评论(0) 推荐(0) 编辑
摘要:很多编程语言中都提供了两种表示小数的数据类型,分别是双精度浮点数和单精度浮点数。双精度浮点数类型用64位、单精度浮点数类型用32位来表示全体小数。在语言中一般,双精度浮点数类型和单精度浮点数类型分别用double和float来表示。 浮点数是指用符号、尾数、基数和指数这四部分来表示的小数(图3-3) 阅读全文
posted @ 2023-02-09 20:56 原魏薯片 阅读(173) 评论(0) 推荐(0) 编辑
摘要:计算机之所以会出现运算错误,是因为“有一些十进制数的小数无法转换成二进制数”。图3-2中,小数点后4位用二进制数表示时的数值范围为0.0000~0.1111。因此,这里只能表示0.5、0.25、0.125、0.0625这四个二进制数小数点后面的位权组合而成(相加总和)的小数。将这些数值组合后能够表示 阅读全文
posted @ 2023-02-09 20:39 原魏薯片 阅读(586) 评论(0) 推荐(0) 编辑
摘要:计算机内部所有信息都是以二进制数的形式来处理的,因此在这一点上,整数和小数并无差别。不过,使用二进制数来表示整数和小数的方法却有很大不同。 我们举一个例子,如图3-2只需要将各位数值和位权相乘,然后再将相乘的结果相加即可实现。 阅读全文
posted @ 2023-02-09 20:20 原魏薯片 阅读(62) 评论(0) 推荐(0) 编辑
摘要:代码清单3-1是将0.1累加100次,然后将结果输出到显示器上的C语言程序。 0.1累加100次后的结果是10。但是代码清单3-1的程序运行后,显示器上显示的结果并不是10(图3-1)。 这是与计算机处理小数的机制有关。 阅读全文
posted @ 2023-02-09 17:10 原魏薯片 阅读(19) 评论(0) 推荐(0) 编辑
摘要:将二进制数表示的信息作为四则运算的数值来处理就是算术。而像图形模式那样,将数值处理为单纯的0和1 的罗列就是逻辑。 计算机能处理的运算,大体可分为算术运算和逻辑运算。算术运算是指加减乘除四则运算。逻辑运算是指对二进制数各数字位的0和1分别进行处理的运算,包括逻辑非(NOT运算)、逻辑与(AND运算) 阅读全文
posted @ 2023-02-09 16:50 原魏薯片 阅读(147) 评论(0) 推荐(0) 编辑
摘要:当二进制数的值表示 图形模式而非数值时,移位后需要在最高位补0.这就称为逻辑右移(如2-9)。 将二进制数作为带符号的数值进行运算时,位移后要在最高位填充移位前符号位的值(0或1)。这称为算术右移。 只有在右移时才必须区分逻辑位移和算术位移。左移时,无论是图形模式(逻辑左移)还是相乘运算(算术左移) 阅读全文
posted @ 2023-02-09 16:21 原魏薯片 阅读(412) 评论(0) 推荐(0) 编辑
摘要:补数只有0和1两种形式。二进制数中表示负数值时,一般会把最高位作为符号来使用,因此我们把这个最高位称为符号位。符号位是0时表示正数,符号位是1时表示负数。 补数就是用正数来表示负数,为了获得补数,我们需要将二进制数的各数位的数值全部取反,然后将结果加1.,例如,(图2-5),用8位二进制数表示-1时 阅读全文
posted @ 2023-02-09 16:06 原魏薯片 阅读(152) 评论(0) 推荐(0) 编辑
摘要:和十进制数一样,四则运算同样也可以使用在二进制数中,只要注意逢2 进位即可。 移位运算指的是将二进制数值的各数位进行左右移位(shif=移位)的运算。移位有左移(像高位方向)和右移(像低位方向)两种。在一次运算中,可以进行多个数位的移位操作。 代码清单2-1中列出的是把变量a中保存的十进制数值39左 阅读全文
posted @ 2023-02-09 15:52 原魏薯片 阅读(248) 评论(0) 推荐(0) 编辑
摘要:什么是二进制数?为了能够清晰地说明二进制数的机制,首先让我们把00100111这个二进制数值转换成十进制数值来看一下。二进制数的值转换成十进制数的值,只需要将而二进制数的个数位的值和位权相乘,然后将相乘的结果相加即可(图2-3)。 首先,从位权的含义说起。例如,十进制数39的各个数位的数值,并不是简 阅读全文
posted @ 2023-02-08 21:42 原魏薯片 阅读(319) 评论(0) 推荐(0) 编辑
摘要:计算机内部是由IC这种电子部件构成的。第1章介绍的CPU(微处理器)和内存也是IC的一种。IC有几种不同形状,有的像一条黑色蜈蚣,在其两侧有无数个乃至数百个引脚;有的则像插花用的针盘,引脚在IC 内部并排排列着。IC的所有引脚,只有直流电压0V或5V两个状态。也就是说,IC的一个引脚,只能表示两个状 阅读全文
posted @ 2023-02-08 21:28 原魏薯片 阅读(291) 评论(0) 推荐(0) 编辑
摘要:机器语言的种类 表1-2按照功能对CPU能执行的机器语言指令进行了大体分类: 阅读全文
posted @ 2023-02-08 20:15 原魏薯片 阅读(24) 评论(0) 推荐(0) 编辑
摘要:这一小节是表1-1中出现的基址寄存器和变址寄存器。通过这两个寄存器,我们可以对主内存上特定的内存区域进行划分,从而实现类似数组的操作。 首先,我们用十六进制数将计算机内存上00000000~FFFFFFFF的地址划分出来。那么,凡是该范围的内存区域只要有一个32位的寄存器,即可查看全部内存地址。但如 阅读全文
posted @ 2023-02-08 20:11 原魏薯片 阅读(28) 评论(0) 推荐(0) 编辑
摘要:哪怕是高级语言编写的程序,函数调用处理也是通过把程序计数器的值设定成函数的存储地址来实现的。不过,这和条件分支、循环的机制有所不同,因此单纯的跳转指令无法实现函数调用。函数的调用需要在完成函数内部的处理后,处理流程在返回函数调用点(函数调用指令的下一个地址)。 图1-7是给变量a和b分别带入123和 阅读全文
posted @ 2023-02-08 19:54 原魏薯片 阅读(25) 评论(0) 推荐(0) 编辑
摘要:程序的流程分为顺序执行、条件分支和循环三种。顺序执行是指按照地址内容的顺序执行。条件分支是指根据条件执行任意地址的指令。循环是指重复执行同一地址指令。顺序执行的情况比较简单,每执行一个指令程序计数器的值就自动加1。但若程序中存在条件分支和循环,机器语言的指令就可以将程序计数器的值设定为任意地址。这样 阅读全文
posted @ 2023-02-08 18:56 原魏薯片 阅读(46) 评论(0) 推荐(0) 编辑
摘要:只有一行的有用程序很少见,机器语言的程序也是如此。下面是程序是如何按照流程来运行的。 图1-4是程序启动时内存内容的模型。用户发出启动程序后,Windows等操作系统会把硬盘中保存的程序复制到内存中。正如前文介绍的那样,存储指令和数据内存,是通过地址来划分的。 地址0100是程序运行的开始位置。Wi 阅读全文
posted @ 2023-02-08 18:29 原魏薯片 阅读(19) 评论(0) 推荐(0) 编辑
摘要:CPU的四个结构部分中,程序员只需要了解寄存器即可,这是因为程序是把寄存器作为对象来描述的。 首先我们看一下代码清单1-1.这是汇编语言(assembly)编写的程序的一部分。汇编语言采用助记符(memonic)来编写程序,每一个原本是电气信号的机器语言指令都会有一个与其相应的助记符,助记符通常为指 阅读全文
posted @ 2023-02-08 18:16 原魏薯片 阅读(78) 评论(0) 推荐(0) 编辑
摘要:1.1 cpu的内部结构解析 如1-1图展示了程序运行的一般流程。了解程序运行流程是掌握运行机制的基础和前提。 CPU和内存是由许多晶体组成的电子部件,通常称为IC(Integrated Circuit,集成电路。)从功能方面来看,如图1-2所示,CPU的内部由寄存器、控制器、运算器和时钟四个部分构 阅读全文
posted @ 2023-02-08 16:08 原魏薯片 阅读(268) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示