02 2023 档案
摘要:vue是一套用于构建用户界面的渐进式(vue可以自底向上逐层的应用;由一个轻量小巧的核心库 到 可以引入各式各样的vue插件)JavaScript框架。 vue的特点: 1.采用组件化模式,提高代码复用率、且让代码更好维护。 一个.vue就是一个组件 2.声明式编码,让编码人员无需直接操作DOM,提
阅读全文
摘要:1、编程语言1.1编程计算机:任何能够执行代码的设备:智能手机、ATM机等等 1.2计算机语言机器语言:由“0”和“1”组成的二进制(计算机语言的基础) 1.3编程语言固定的格式和词汇来控制计算机,主要用高级语言:Java、PHP、JavaScript如今通用的编程语言:汇编语言和高级语言。 1.4
阅读全文
摘要:C语言的特点:C语言虽是高级编程语言,但它也具备了能够和汇编语言相媲美的低层处理(内存操作及位操作)功能。 变量和函数:不管使用什么样的编程语言,程序内容都是由数据和处理构成的至于程序的数据和处理具体该如何表示,则根据编程语言的不同而不同。在 C语言中,数据用变量来表示,处理用函数来表示。因而,语言
阅读全文
摘要:到目前为止,我们已经用程序表示了直觉、想法、习惯以及经验等。不过,除此之外,人类还有一个思考方式。思考方式是思考方法的节奏。人类大脑中有类似于“石头、石头、布、剪刀”或“剪刀、石头、石头、布”这种具有节奏感的短语,人类会在此基础上做出判断这就是思考方式。 代码清单 12-4 是用程序来实现思考方式的
阅读全文
摘要:人类的日常判断通常是根据直觉和经验做出的。直觉并不仅仅是简单的任意思考,通常还带有一些个人的思维习惯。在前面的介绍中我们已经提到,通过借助随机数,思考习惯等也是可以表示的。而如果在此基础上再加上经验(记忆)元素的话,想必就可以作成更接近人类思考的程序了。 请大家考虑一下猜拳游戏中是如何用到经验的。经
阅读全文
摘要:接下来,让我们看一下随机数在程序中扮演的角色。在编写游戏程序时,以及在计算机模拟“等情况下,经常使用随机数。随机数也是用程序来表示人类的直觉及念头的一种方法。从代码清单 12-2 的运行结果中大家可以发现,“一直在出石头的时候突然出了一个剪刀”,这确实很像人类的行为方式。 随机数色子(随机数色子的各
阅读全文
摘要:即使是成年人,可能偶尔也会像代码清单 12-1 这样猜拳时随意决定出什么。不过,并不是所有人都如此。例如,“小 A 同学喜欢出石头”,像这样,出拳习惯是因人而异的。习惯也是人类的思考方式。而如果要用程序来表示人类的习惯,就需要对习惯进行定量表现。虽然这里提到了定量,但大家不要想得太复杂。出石头的概率
阅读全文
摘要:那么,如何才能让计算机思考呢?接下来,我们就一边用 C 语言制作《猜拳游戏》,一边来尝试各种思考方式。在猜拳游戏中,程序需要让计算机像猜拳选手一样来思考。因此,为了制作该游戏,就需要“用程序来实现猜拳选手的思考步骤”。请大家冷静地回忆一下自己在猜拳时的思考过程。如果这个思考过程能直接用程序来表现的话
阅读全文
摘要:程序就如同是由计算机执行的各种指令罗列起来的文章。计算机内部的 CPU,通过对该文章的内容进行解析和运行,来控制连接到计算机的各种外围设备。具体来说,控制就是指 CPU 和各种设备之间配合进行数据的输入输出处理。关于程序的运行原理,在前面章节中我们已经从各方面进行了说明。那么,如果此时再问大家“使用
阅读全文
摘要:在本章的最后,让我们一起来看一下显示器显示文字及图形的机制。如果用一句话来简单地概括该机制,那就是显示器中显示的信息一直存储在某内存中。该内存称为 VRAM (Video RAM)。在程序中只要往VRAM中写人数据,该数据就会在显示器中显示出来。实现该功能的程序,是由操作系统或 BIOS 提供,并借
阅读全文
摘要:在了解 IO输人输出及中断处理的同时,还希望大家记住另外一个机制,这就是 DMA ( Direct Memory Access )。DMA 是指在不通过 CPU 的情况下,外围设备直接和主内存进行数据传送。磁盘等都用到了这个 DMA机制。通过利用 DMA,大量数据就可以在短时间内转送到主内存。之所以
阅读全文
摘要:在主程序运行的过程中,中断发生的频率有多大呢?实际上,大部分的外围设备,都会频繁地发出中断请求。其原因就是为了实时处理从外围设备输人的数据。虽然不利用中断也可以从外围设备输入数据。但那种情况下,主程序就必须要持续不断地检测外围设备是否有数据输人。 由于外围设备有很多个,因此就有必要按照顺序来调查。按
阅读全文
摘要:让我们再来看一下图 11-4。在“I/O 范围”下面有一个“IRQ”项目,对应的值是 0x00000006 ( 06)。IRQ(Iterrupt Request) 是中断请求的意思。那么,IQ 主要是用来做什么的呢? IRQ 是用来暂停当前正在运行的程序,并跳转到其他程序运行的必要机制。该机制称为中
阅读全文
摘要:首先让我们利用 IN 指令和 OUT 指令,来进行一个直接控制硬件的试验。假设该试验的目的是让计算机内配置的蜂鸣器(小喇叭)发音。虽然蜂鸣器内置在计算机内部,但其本身也是外围设备的一种因为就算是把蜂鸣器取出,对计算机主机也不会有什么影响。 由于用汇编语言编写程序比较麻烦,因此这里我们采取在 C 语言
阅读全文
摘要:Window 控制硬件时借助的是输入输出指令。其中具有代表性的两个输入输出指令就是IN 和 OUT。这些指令也是汇编语言的助记符IN 指令和 OUT 指令的语法如图 11-2 所示。这是 Pentium 等x86系列 CPU用的IN指令和 OUT 指令的语法。IN 指令通过指定端口号的端口输人数据,
阅读全文
摘要:在用C语言等高级编程语言开发的 Windows 应用中,大家很少能接触到直接控制硬件的指令。这是因为硬件的控制是由 Windows 全权负责的。 不过,Windows 提供了通过应用来间接控制硬件的方法。利用操作系统提供的系统调用功能就可以实现对硬件的控制。在 Windows 中,系统调用称为API
阅读全文
摘要:通过对 C语言源代码和汇编语言源代码进行比较,想必大家对程序是怎样跑起来的”又有了更深的理解。而且,从汇编语言源代码中获得的知识,在某些情况下对查找 bug 的原因也是有帮助的。 让我们来看个示例。代码清单 10-13 是更新全局变量 counter 的值的C语言程序。MyFunc1 函数和MyFu
阅读全文
摘要:下面让我们来看一下条件分支的实现方法。条件分支的实现方法同循环处理的实现方法类似,使用的也是 cmmp 指令和跳转指令,这一点估计大家也预料到了。 没错,条件分支就是利用这些指令来实现的。不过,为了以防万我们来确认一下。代码清单 10-11 是,根据变量 a 的值来调用不同函数(MySubl 函数、
阅读全文
摘要:接下来,让我们继续解析汇编语言的源代码,看一下 for 循环及 if条件分支等 C 语言程序的流程控制是如何实现的 。代码清单 10-8 是将局部变量i作为循环计数器“连续进行 10 次循环的 C 语言源代码。在for 语句中,调用了不做任何处理的 MySub 函数。这里我们把代码清单10-8 转换
阅读全文
摘要:为什么局部变量只能在定义该变量的函数内进行参阅呢?这是因为,局部变量是临时保存在寄存器和栈中的。正如本章前半部分讲的那样,函数内部利用的栈,在函数处理完毕后会恢复到初始状态,因此局部变量的值也就被销毁了,而寄存器也可能会被用于其他目的。因此,局部变量只是在函数处理运行期间临时存储在寄存器和栈上。 在
阅读全文
摘要:熟悉了汇编语言后,接下来将进人到本章的后半部分。C 语言中在函数外部定义的变量称为全局变量,在函数内部定义的变量称为局部变量。全局变量可以参阅源代码的任意部分,而局部变量只能在定义该变量的函数内进行参阅。例如,在 MyFuncA 数内部定义的i这个局部变量就无法通过 MyFuncB 函数进行参阅。与
阅读全文
摘要:接下来,让我们透过执行 AddNum 函数的源代码部分,来看一下参数的接收、返回值的返回等机制(代码清单 10-5)。 ebp 寄存器的值在(1)中人栈,在(5)中出栈。这主要是为了把函数中用到的 ebp 寄存器的内容,恢复到函数调用前的状态。在进入函数处理之前,无法确定 ebp 寄存器用到了什么地
阅读全文
摘要:前面说了这么多,至此我们终于把阅读汇编语言源代码的准备工作完成了。让我们再来回顾一下代码清单 10-2 的内容。首先,让我们从MyFunc 函数调用AddNum 函数的汇编语言部分开始,来对函数的调用机制进行说明。函数调用是栈发挥大作用的场合。把代码清单 10-2 中的C 语言源代码部分去除,然后再
阅读全文
摘要:程序运行时,会在内存上申请分配一个称为栈的数据空间。栈stack)有“干草堆积如山”的意思。就如该名称所表示的那样,数据在存储时是从内存的下层(大的地址编号 )逐渐往上层(小的地址编号)累积,读出时则是按照从上往下的顺利进行(图 10-3 )的。 栈是存储临时数据的区域,它的特点是通过 push 指
阅读全文
摘要:指令中最常使用的是对寄存器和内存进行数据存储的 mov 指令mov 指令的两个操作数,分别用来指定数据的存储地和读出源。操作数中可以指定寄存器、常数、标签(附加在地址前 ),以及用方括号([])围起来的这些内容。如果指定了没有用方括号围起来的内容就表示对该值进行处理:如果指定了用方括号围起来的内容,
阅读全文
摘要:在汇编语言中,1行表示对 CPU 的一个指令。汇编语言指令的语法结构是操作码 +操作数(也存在只有操作码没有操作数的指令)。 操作码表示的是指令动作,操作数表示的是指令对象。操作码和操作数罗列在一起的语法,就是一个英文的指令文本。操作码是动词操作数相当于宾语。例如,用汇编语言来分析“Give me
阅读全文
摘要:汇编语言的源代码,是由转换成本地代码的指令(后面讲述的操作码)和针对汇编器的伪指令构成的。伪指令负责把程序的构造及汇编的方法指示给汇编器(转换程序)。不过伪指令本身是无法汇编转换成本地代码的。这里我们把代码清单10-2中用到的伪指令部分摘出,如代码清单10-3所示。 由伪指令 segment和end
阅读全文
摘要:除了将本地代码进行反汇编这一方法外,通过其他方式也可以获取汇编语言的源代码。大部分C语言编译器,都可以把利用C语言编写的源代码转换成汇编语言的源代码,而不是本地代码。利用该功能,就可以对C语言的源代码和汇编语言的源代码进行比较研究。笔者在学生时代的报告中,使用的便是该功能。Borland C++中,
阅读全文
摘要:在加法运算的本地代码中加上add(addition的缩写)、在比较运算的本地代码中加上cmp(compare的缩写)等。这些缩写称为助记符,使用助记符的编程语言称为汇编语言。这样,通过查看汇编语言编写的源代码,就可以了解程序的本质了。因为这和查看本地代码的源代码,是同一级别的。 不过,即使是用汇编语
阅读全文
摘要:Windows操作系统的主要特征如下: (1)32 位操作系统(也有 64 位版本 ) Windows处理数据的基本单位是32位。凡是在Windows上运行的应用,都可以毫无保留地尽可能地使用32位的数据。 (2)通过API 函数集来提供系统调用 Windows是通过名为API的函数集来提供系统调用
阅读全文
摘要:通过使用操作系统提供的系统调用,程序员就没必要编写直接控制硬件的程序了。而且,通过使用高级编程语言,有时甚至也无需考虑系统调用的存在。这是因为操作系统和高级编程语言能够使硬件抽象化。这是个非常了不起的处理。下面就让我们来看一下硬件抽象化的具体实例。代码清单 9-2 是用C 语言编写的往文件中写人字符
阅读全文
摘要:操作系统的硬件控制功能,通常是通过一些小的函数集合体的形式来提供的。这些函数及调用函数的行为统称为系统调用(systemcall),也就是应用对操作系统(system)的功能进行调用(call)的意思。在前面的程序中用到了 time() 及 printf() 等函数,这些函数内部也都使用了系统调用。
阅读全文
摘要:制作应用的程序员们意识到一点:那就是你们制作的不是硬件,而是利用操作系统功能的应用。 下面就来看一下操作系统是如何给开发人员带来便利的。代码清单9-1 表示的是,在 Windows 操作系统下,用C语言制作一个具有表示当前时间功能的应用。time 是用来取得当前日期和时间的函数printf0) 是用
阅读全文
摘要:操作系统的原型:仅具有加载和运行功能的监控程序。 通过事先启动监控程序,程序员就可以根据需要的各种程序加载到内存中运行。如下图: 在利用监控程序编写程序的过程中,发现很多程序都要共通的部分。因此,基本的输入输出部分的程序就被追加到了监控程序中。初期的操作系统就这样诞生了(图 9-2 )。 之后,随着
阅读全文
摘要:Q:编译器和解释器有什么不同?A:编译器是在运行前对所有源代码进行解释处理的。而解释器则是在运行时对源代码的内容一行一行地进行解释处理的。 Q:“分割编译”指的是什么?A:将整个程序分为多个源代码来编写,然后分别进行编译,最后链接成一个EXE文件。这样每个源代码都相对变短,便于程序管理。 Q:“Bu
阅读全文
摘要:EXE文件的内容分为再配置信息、变量组和函数组,这一点想必大家都清楚了吧。不过,当程序加载到内存后,除此之外还会额外生成两个组,那就是栈和堆。栈是用来存储函数内部临时使用的变量(局部变量),以及函数调用时所用的参数的内存区域。堆是用来存储程序运行时的任意数据及对象的内存领域(图8-10)。 EXE文
阅读全文
摘要:在程序运行时,虚拟的内存地址会转换成实际的内存地址。链接器会在EXE文件的开头,追加转换内存地址所需的必要信息。这个信息称为再配置信息。 EXE文件的再配置信息,就成为了变量和函数的相对地址。相对地址表示的是相对于基点地址的偏移量,也就是相对距离。实现相对地址,也是需要花费一番心思的。在源代码中,虽
阅读全文
摘要:Windows以函数的形式为应用提供了各种功能。这些形式的函数称为API (应用程序接口)。例如,Samplel.c中调用的MessageBox0,它并不是C语言的标准函数,而是Windows提供的API的一种。MessageBox()提供了显示消息框的功能。 Windows中,API的目标文件,并
阅读全文
摘要:下图的错误消息表示的是无法解析Sample1.obj参照的外部符号。 外部符号是指其他目标文件中的变量或函数。sprintf及MessageBoxA是目标文件中sprintf及MessageBox()的名称。代码中记述的函数名同目标文件中的函数名有一些差异,不过大家只需把它理解成这是C编译器的规定即
阅读全文
摘要:编译器转换源代码后,就会生成本地文件。不过,本地文件是无法直接运行的。 编译器转换源代码后,就会生成本地文件。不过,本地文件是无法直接运行的。为了得到可以运行的EXE文件,编译之后还需要进行“链接”处理。下面,就让我们使用Borland C++ Compiler5.5(以下称为Borland C++
阅读全文
摘要:能够把C 语言等高级编程语言编写的源代码转换成本地代码的程序称为编译器。每个编写源代码的编程语言都需要其专用的编译器将 C语言编写的源代码转换成本地代码的编译器称为 C 编译器。 编译器首先读入代码的内容,然后再把源代码转换成本地代码编译器中就好像有一个源代码同本地代码的对应表。但实际上,仅仅靠对应
阅读全文
摘要:Windows中的EXE文件的程序内容,使用的就是本地代码。 本地代码的内容是人类无法理解的。 接下来,我们把刚才的 EXE 文件的内容 Dump 一下。Dump 是指把文件的内容,每个字节用2 位十六进制数来表示的方式。本地代码的内容就是各种数值的罗列,这一点想必大家都了解。而这些数值就是本地代码
阅读全文
摘要:1.CPU 可以解析和运行的程序形式称为什么代码? 本地代码(机器语言代码) 2.将多个目标文件结合生成 EXE 文件的工具称为什么? 链接器 3,扩展名为 .obi 的目标文件的内容,是源代码还是本地代码? 本地代码 4.把多个目标文件收录在一起的文件称为什么? 库文件 5.仅包含 Windows
阅读全文
摘要:程序的运行环境中,存在着名为BIOS(Basic Input/Output System)的系统。BIOS存储在ROM中,是预先内置在计算机主机内部的程序。BIOS除了键盘、磁盘、显卡等基本控制程序外,还有启动“引导程序”的功能。引导程序是存储在启动驱动器起始区域的小程序。操作系统的启动驱动器一般是
阅读全文
摘要:除虚拟机的方法之外,还有一种方法能够提供不依赖于特定硬件及操作系统的程序运行环境,那就是Java。 大家说的Java,有两个层面的意思。一个是作为编程语言的Java,另一个是作为程序运行环境的Java。同其他编程语言相同,Java也是将Java语法记述的源代码编译后运行。不过,编译后生成的并不是特定
阅读全文
摘要:即使不通过移植,也可以使用别的方法来运行其他操作系统的应用。这里我们要介绍的方法就是利用虚拟机软件。通过利用该虚拟机,我们就可以在Macintosh的Mac操作系统上运行Windows应用了。 Virtual PC for MAC 可以使Macintosh这一硬件变得同AT兼容机一样,从而能在该硬件
阅读全文
摘要:API也称为“系统调用”,是应用调用操作系统功能的手段。 Unix系列操作系统FreeBSD中,存在一种名为Ports的机制。该机制能够结合当前运行的硬件环境来编译应用的源代码,进而得到可以运行的本地代码系统。如果目标应用的源代码没有在硬件上的话,Ports就会自动使用 FTP"连接到相关站点来下载
阅读全文
摘要:接下来让我们看一下操作系统的种类。同样机型的计算机,可安装的操作系统类型也会有多种选择。例如,AT兼容机的情况下,除Windows之外,还可以采用Unix系列的 Linux及 FreeBSD”等多个操作系统。当然,应用软件则必须根据不同的操作系统类型来专门开发。CPU的类型不同,所对应的机器语言也不
阅读全文
摘要:计算机的硬件并不仅仅是由CPU构成的,还包括用于存储程序指令和数据的内存,以及通过1/O连接的键盘、显示器、硬盘、打印机等外围设备。而计算机是如何控制这些外围设备的呢?这和计算机的机型有着很大的关系。Windows操作系统对克服这些硬件构成的差异做出了很大贡献。在20年前的MS-DOS时代,日本国内
阅读全文
摘要:1.应用的运行环境指的是1.操作系统和计算机本身(硬件)的种类 2. Macintosh用的操作系统(MacOS),在AT兼容机上无法运行。 3. Windows上的应用,在MacOS上无法运行 4. FreeBSD提供的Ports,指的是:通过使用源代码来提供应用,并根据运行环境进行整合编译,从而
阅读全文
摘要:最后,让我们来看一下图像文件的数据形式。图像文件的使用目的通常是把图像数据输出到显示器、打印机等设备上。Windows的标准图像数据形式为BMP,是完全未压缩的。由于显示器及打印机输出的bit (点)是可以直接映射(mapping)的,因此便有了BMP=bitmap这一名称。除BMP格式以外,还有其
阅读全文
摘要:使用哈夫曼树后,出现频率越高的数据所占用的数据位数就越少而且数据的区分也可以很清晰地实现。 通过图 6-5 的步骤 2可以发现,在用枝条连接数据时,我们是从出现频率较低的数据开始的,这就意味着出现频率越低的数据到达根部的枝条数就越多。而枝条数越多,编码的位数也就随之增多了。 从用哈夫曼算法压缩过的文
阅读全文
摘要:哈夫曼算法是指,为各压缩对象文件分别构造最佳的编码体系,并以该编码体系为基础来进行压缩。因此,用什么样式的编码(哈夫曼编码)对数据进行分割,就要由各个文件而定。 用哈夫曼算法压缩过的文件中,存储着哈夫曼编码信息和压缩过的数据,如下图。 接下来,我们尝试一下把 AAAAAABBCDDEEEEEF 中的
阅读全文
摘要:哈夫曼算法是1952年提出的压缩算法,日本人常用的压缩软件LHA使用的就是哈夫曼算法。 文本文件是由不同类型的字符组合而成的,而且不同的字符出现的次数也是不同的。 注!:不管是不满8位的数据,还是超过8位的数据,最终都要以8位为单位保存到文件中。 因为磁盘是以字节(8位)为单位保存数据的。 1看作是
阅读全文
摘要:RLE不适合文本文件的压缩。 通过表 6-1 可以看出,使用 RLE 算法对文本文件进行压缩后,文件却增大了,而且几乎是压缩前的 2倍。这是因为文本文件中同样字符连续出现的部分并不多。以存储着“This is a pen.”这 14 个字符的文本文件为例,使用 RLE 算法对其进行压缩后,就变成了“
阅读全文
摘要:对存储着AAAAAABBCDDEEEEEF这17个半角字符的文件(文本文件)进行压缩。 由于半角字母中,1个字符是作为1个字节的数据被保存在文件中的,因此上述文件的大小就是17字节,只要文件小于17字节,我们可以使用任何压缩方法。 采用“字符*重复次数”:AAAAAABBCDDEEEEEF就可以用A
阅读全文
摘要:1.文件储存的基本单位时什么?1字节(=8位) 文件是字节数据的集合体。文件是将数据储存在磁盘等存储媒介中的一种形式。程序文件中存储数据的单位是字节。文件的大小用__KB来表示,因为文件是以字节(B=Byte)为单位来存储的。 用1字节(=8位)表示的字节数据有256种,用二进制数来表示的话,其范围
阅读全文
摘要:磁盘的物理结构是指磁盘存储数据的形式。 磁盘是通过把其物理表面划分成多个空间来使用的。划分的方式有扇区方式和可变长方式两种,前者是指将磁盘划分为固定长度的空间,后者则是指把磁盘划分为长度可变的空间。一般的Windows计算机所使用的硬盘和软盘,采用的都是扇区方式。扇区方式中,把磁盘表面分成若干个同心
阅读全文
摘要:以图形用户界面(GUI, Graphical User Interface)为基础的Windows,可以说是一个巨大的操作系统。Windows的前身是MS-DOS操作系统,最初版本可以在128KB左右的内存上运行,而想要Windows流畅运行的话,至少需要512MB的内存。而且,由于Windows具
阅读全文
摘要:接下来说一下虚拟内存虚拟内存是指把磁盘的一部分作为假想的内存来使用。这与磁盘缓存是假想的磁盘(实际上是内存)相对,虚拟内存是假想的内存(实际上是磁盘)。 通过借助虚拟内存,在内存不足时也可以运行程序。例如,在只剩下5MB内存空间的情况下也能运行10MB大小的程序。不过,就如本章开头所讲述的那样,CP
阅读全文
摘要:磁盘缓存(disk cache):磁盘缓存的缓存(cache)是高速缓存、仓库的意思。 磁盘缓存指的是把从磁盘中读出的数据存储到内存空间中的方式。这样一来,当接下来需要读取同一数据时,就不用通过实际的磁盘,而是从磁盘缓存中把内容读出。使用磁盘缓存可以大大改善磁盘数据的访问速度。如下图:
阅读全文
摘要:1.存储程序方式指的是什么?在存储装置中保存程序,并逐一运行的方式 2.通过使用内存来提高磁盘访问速度的机制称为什么?Disk Cache(磁盘缓存) 3.把磁盘的一部分作为假想内存来使用的机制称为什么?虚拟内存(virtual memory) 4. Windows 中,在程序运行时,存储着可以动态
阅读全文
摘要:二叉查找树是指在链表的基础上往数组中追加元素时,考虑到数据的大小关系,将其分成左右两个方向的表现形式。例如,假设我们事先把50这个值保存到了数组中。那么,如果接下来的值比先前保存的数值大的话,就要将其放到右边,反之如果小的话就放在左边。但实际的内存并不会分成两个方向,这是在程序逻辑上实现的(图4-1
阅读全文
摘要:在数组的各个元素中,除了数据的值之外,通过为其附带上下一个元素的索引,即可实现链表。 数据的值和下一个元素的索引组合在一起,就构成了数组的一个元素。这样,数组元素相连就构成了念珠似的链表。由于链表末尾的元素没有后续的数据,因此就需要用别的值(在这里是-1)来填充(图4-10)。 在需要追加或删除数据
阅读全文
摘要:栈和队列,都可以不通过指定地址和索引来对数组的元素进行读写。需要临时保存计算过程中的数据、连接在计算机上的设备或者输入输出的数据时,都可以通过这些方法来使用内存。如果每次保存临时数据都需指定地址和索引,程序就会变得比较麻烦,因此要加以改进。 栈和队列的区别在于:数据出入的顺序是不同的。在对内存数据进
阅读全文
摘要:数组是指多个同样数据类型的数据在内存中连续排列的形式。作为数组元素的各个数据会通过连续的编号被区分开来,这个编号称为索引(index)。指定索引后,就可以对该索引所对应地址的内存进行读写操作。而索引和内存地址的变换工作则是由编译器自动实现的。 代码清单4-3表示的是在C语言中定义char类型、sho
阅读全文
摘要:指针也是一种变量,它所表示的不是数据的值,而是存储着数据的内存的地址。通过使用指针,就可以对任意指定地址的数据进行读写。虽然前面所提到的假想内存IC中仅有10位地址信号,但大家在Windows计算机上使用的程序通常都是32位(4字节)的内存地址。这种情况下,指针变量的长度也是32位。 请大家看一下下
阅读全文
摘要:虽然内存的实体是内存IC,不过从程序员的角度来看,也可以把它假想成每层都存储着数据的楼房,并不需要过多地关注内存IC的电源和控制信号等。因此,之后的讲解中我们也同样会使用楼房图(或者与楼房相似的图)。内存为1KB时,表示的是如图4-3所示的有1024层的楼房(这里地址的值是从上往下逐渐变大,不过也有
阅读全文
摘要:1.有十个地址信号引脚的内存IC(集成电路)可以指定的地址范围是多少?答:用二进制数来表示的话是0000000000~1111111111(用十进制数来表示的话是0~1023) 2. 高级编程语言中的数据类型表示的是什么?答:占据内存区域的大小和存储在该内存区域的数据类型 3.在32位内存地址的环境
阅读全文
摘要:最后再补充说明一下二进制数和十六进制数的关系。在以位为单位表示数据时,使用二进制数很方便,但如果位数太多,看起来就比较麻烦。因此,在实际程序中,也经常会用十六进制数来代替二进制数。在C语言程序中,只需在数值的开头加上Ox(0和x)就可以表示十六进制数。 二进制数的4位,正好相当于十六进制数的1位。例
阅读全文
摘要:计算机计算出错的原因之一是,采用浮点数来处理小数(另外,也有因“位溢出”而造成计算错误的情况)。作为程序的数据类型,不管是使用单精度浮点数还是双精度浮点数,都存在计算出错的可能性。接下来将介绍两种避免该问题的方法。 (1)是回避策略,即无视这些错误。根据程序目的的不同,有时一些微小的偏差并不会造成什
阅读全文
摘要:该程序执行后,十进制数0.75用单精度浮点数来表示就变成了0-01111110-10000000000000000000000(图3-7)。 加入破折号(-)是为了区分符号部分、指数部分、尾数部分。这里,符号部分为0,指数部分为01111110,尾数部分为1000000000000000000000
阅读全文
摘要:尾数部分使用正则表达式(按照特定的规则来表示数据的形式即为正则表达式,除小数外,字符串以及数据库等都有各自的正则表达式),可以将表现形式多样的浮点数统一为一种表现形式。例如,十进制数0.75就有很多种表现形式,如下图所示: 虽然它们表示的都是同一个数值,但因为表现方法太多,计算机在处理时会比较麻烦。
阅读全文
摘要:像1011.0011这样带小数点的表现形式,完全是纸面上的二进制数表现形式,在计算机内部是无法使用的。那么,实际上计算机是以什么样的表现形式来处理小数的呢?我们一起来看一下。很多编程语言中都提供了两种表示小数的数据类型,分别是双精度浮点数和单精度浮点数。双精度浮点数类型用64位、单精度浮点数类型用3
阅读全文
摘要:由于前一节了解到将小数二进制数转换成十进制数的方法后,计算机运算出错的原因也就容易理解了。之所以容易出错的原因是“有一些十进制数的小数无法转换成二进制数。例如:十进制数是0.1,就无法用二进制数表示。 上图是小数点后四位能够用二进制数表示的数值(二进制数是连续的,十进制数是非连贯的)。 同时通过这个
阅读全文
摘要:小数点前面部分的转换方法:将各数位数值和位权相乘,然后再将相乘的结果相加即可实现。 小数点后面部分的转换方法:将各数位的数值和位权相乘的结果相加。
阅读全文
摘要:首先,我们来看一个计算机运算错误(无法得到正确结果)的例子。下图是将0.1累加100次,然后将结果输出到显示器上的C语言程序。 运行过程是这样的: 首先把0赋值给变量sum,然后在此基础上累加100次0.1。sum+=0.1;表示为现在的sum值加0.1。for(i=1;i<=100;i++).)表
阅读全文
摘要:将二进制数表示的信息作为四则运算的数值来处理就是算术。而像图形模式那样,将数值处理为单纯的0和1的罗列就是逻辑。 计算机能处理的运算,大体可分为算术运算和逻辑运算。算术运算是指加减乘除四则运算。逻辑运算是指对二进制数各数字位的0和1分别进行处的运算,包括逻辑非(NOT运算)、逻辑与(AND运算)、逻
阅读全文
摘要:接下来我们就一起来看看表示负数的方法和右移的方法:二进制数中表示负数值时,一般会把最高位作为符号来使用,因此我们把这个最高位称为符号位。符号位是0时表示正数,符号位是1时表示负数。计算机在做减法运算时,实际上内部是在做加法运算。用加法运算来实现减法运算,为此,在表示负数时就需要使用“二进制的补数”。
阅读全文
摘要:在了解了二进制数的机制后,接下来我们来看一下运算。和十进制数一样,四则运算同样也可以使用在二进制数中,只要注意逢2进位即可。下面,我们就来重点看一下二进制数所特有的运算。二进制数所特有的运算,也是计算机所特有的运算,因此可以说是了解程序运行原理的关键。移位运算指的是将二进制数值的各数位进行左右移位(
阅读全文
摘要:首先让我们来看一下二进制数转换成十进制数的方法:接下来,让我们来解释一下各数位的数值和位权相乘后“相加”这个处理的原因。其实大家所说的数值,表示的就是构成数值的各数位的数值和位权相乘后再相加的结果。例如39这个十进制数,表示的就是30+9,即各数位的数值和位权相乘后再相加的数值。所有数的0次幂都是1
阅读全文
摘要:在C和Java等高级语言编写的程序中,数值、字符串和图像等信息在计算机内部都是以二进制数值的形式来表现的。也就是说,只要掌握了使用二进制数来表示信息的方法及其运算机制,也就自然能够了解程序的运行机制了。IC的一个引脚,只能表示两个状态。IC的这个特性,决定了计算机的信息数据只能用二进制数来处理。由于
阅读全文
摘要:机器语言指令的主要类型和功能:数据转送指令:寄存器和内存、内存和内存、寄存器和外围设备之间的数据读写操作运算指令 :用累加寄存器执行算术运算、逻辑运算、比较运算和移位运算跳转指令 :实现条件分支、循环、强制跳转等call/return 指令: 函数的调用/返回调用前的地址
阅读全文
摘要:CPU会把基址寄存器+变址寄存器的值解释为实际查看的内存地址。变址寄存器的值就相当于高级编程语言程序中数组的索引功能。数组是指同样长度的数据在内存中进行连续排 列的数据构造。用一个数组名来表示全体数据,通过索引来区分数组的各个数据(元素)。例如,一10个元素的数组a,其中的各个 数组a数据就用 a[
阅读全文
摘要:函数调用处理是通过把程序计数器的值设定成函数的储存地址来实现的,哪怕是高级语言编写的程序。 哪怕是高级语言编写的程序,函数”调用处理也是通过把程序计数器的值设定成函数的存储地址来实现的。不过,这和条件分支、循环的机制有所不同,因为单纯的跳转指令无法实现函数的调用。函数的调用需要在完成函数内部的处理后
阅读全文
摘要:程序的流程分为顺序执行、条件分支和循环三种。 顺序执行是按照地址内容的顺序执行指令(每执行一个指令程序计数器的值就自动加1)。 条件分支是指根据条件执行任意地址的指令。循环是指重复执行同一地址的指令。 若存在条件分支和循环,机器语言的指令就可以将程序计数器的值任意定为任意地址(不是+1)。 条件分支
阅读全文
摘要:图1-4是程序起动时内存内容的模型。用户发出启动程序的指示后,Windows等操作系统会把硬盘中保存的程序复制到内存中。 确定程序运行的开始位置,Windows等操作系统把程序从硬盘复制到内存后,会将程序计数器(CPU寄存器的一种)设定为0100,然后程序便开始运行。CPU执行0100地址的指令后,
阅读全文
摘要:程序是把寄存器作为对象来描述的。机器语言级别的程序是通过寄存器来处理的,CPU是(具有各种功能的)寄存器的集合体。 eax(累计寄存器)和ebp(基址寄存器)是CPU内部的寄存器的名称。 根据功能的不同,寄存器大致可分八大类,如表1-1: 在CPU中,程序计数器、累计寄存器、标志寄存器、指令寄存器和
阅读全文
摘要:CPU(中央处理器)相当于计算机的大脑,CPU和内存都是由许多晶体管组成的电子部件,通常称为IC(集成电路)。 CPU的内部是有寄存器(20~100个),控制器,运算器,时钟组成的。 CPU所负责的就是解释和运行最终转换成机器语言的程序内容。 程序运行流程示例
阅读全文