02 2023 档案
摘要:C语言的特点:C语言虽是高级编程语言,但它也具备了能够和汇编语言相媲美的低层处理(内存操作及位操作)功能。 变量和函数:不管使用什么样的编程语言,程序内容都是由数据和处理构成的至于程序的数据和处理具体该如何表示,则根据编程语言的不同而不同。在 C语言中,数据用变量来表示,处理用函数来表示。因而,语言
阅读全文
摘要:程序的使用目的大体可以划分为两类: 一类,是大家作为工具来使用的程序。例如,文字处理器这个程序,大家是将其作为文档处理的工具来使用的。这种情况可以说是程序替代了现有的工具(笔和尺子)。 另外一个使用目的是用程序来代替执行人类的思考过程。例如,微计算机 控制的电饭煲,会根据米和水的份量来自动调整火的大
阅读全文
摘要:如果用一句话来简单地概括该机制,那就是显示器中显示的信息一直存储在某内存中。该内存称为VRAM(Video RAM)。在程序中,只要往VRAM中写入数据,该数据就会在显示器中显示出来。实现该功能的程序,是由操作系统或BIOS提供,并借助中断来进行处理的。 在MS-DOS时代,对大部分计算机来说,VR
阅读全文
摘要:DMA机制是指在不通过CPU的情况下,外围设备直接和主内存进行数据传送。磁盘等都用到了这个DMA机制。通过利用DMA,大量数据就可以在短时间内转送到主内存。之所以这么快速,是因为CPU作为中介的时间被节省了(图11-9)。 资源是计算机具备的有限资源的统称。端口号、IRQ、DMA等可以指定的数值范围
阅读全文
摘要:在主程序运行的过程中,中断发生的频率有多大呢? 实际上,大部分的外围设备,都会频繁地发出中断请求。其原因就是为了实时处理从外围设备输入的数据。虽然不利用中断也可以从外围设备输入数据。但那种情况下,主程序就必须要持续不断地检测外围设备是否有数据输入。 由于外围设备有很多个,因此就有必要按照顺序来调查。
阅读全文
摘要:IRQ是用来暂停当前正在运行的程序,并跳转到其他程序运行的必要机制。该机制称为中断处理。如果没有中断处理,就有可能出现处理无法顺畅进行的情况。从中断处理开始到请求中断的程序(中断处理程序)运行结束之前,被中断的程序(主程序)的处理是停止的。这种情况就类似于在处理文档的过程中有电话打进来,电话就相当于
阅读全文
摘要:Windows控制硬件时借助的是输入输出指令。其中具有代表性的两个输入输出指令就是IN和OUT。这些指令也是汇编语言的助记符。 IN指令和OUT指令的语法如图11-2所示。这是Pentium等x86系列CPU用的IN指令的语法。IN指令通过指定端口号的端口输入数据,并将其存储在CPU内部的寄存器中。
阅读全文
摘要:在C语言等高级编程语言开发的Windows应用中,很少有能直接控制硬件的指令。这是因为硬件的控制是由Windows全权负责的。 不过,Windows提供了通过应用来间接控制硬件的方法。利用操作系统提供的系统调用功能就可以实现对硬件的控制。在Windows中,系统调用称为API(图11-1)各API就
阅读全文
摘要:代码清单10-12中用到了三种跳转指令,分别是比较结果小时跳转的jle 、大时跳转的jge 、不管结果怎样都无条件跳转的jmp。在这些跳转指令之前还有用来比较的cmp指令,比较结果被保存在了标志寄存器中。虽然同C语言源代码的处理流程不完全相同,不过处理结果是相同的。此外,需要注意eax寄存器表示的是
阅读全文
摘要:接下来,让我们继续解析汇编语言的源代码,看一下for循环及if条件分支等C语言程序的流程控制是如何实现的。代码清单10-8是将局部变量i作为循环计数器 连续进行10次循环的C语言源代码。在for语句中,调用了不做任何处理的MySub函数。这里我们把代码清单10-8转换成汇编语言,然后仅把相当于for
阅读全文
摘要:在代码清单10-6中定义了10个局部变量。这是为了表示存储局部变量的不仅仅是栈,还是寄存器。为了确保c1~c10所需的领域,寄存器空闲时就使用寄存器,寄存器空间不足就使用栈。 x86 系列 CPU拥有的寄存器中,程序可以操作的有十几个。其中空闲的,最多也只有几个。因而,局部变量数目很多的时候,可分配
阅读全文
摘要:在C语言中,在函数外部定义的变量称为全局变量,在函数内部定义的变量称为局部变量。全局变量可以参阅源代码的任意部分,而局部变量只能在定义该变量的函数内进行参阅。
阅读全文
摘要:通过执行AddNum函数的源代码部分,来看一下参数的接收、返回值的返回等机制(代码清单10-5)。 ebp寄存器的值在(1)中入栈,在(5)中出栈。这主要是为了把函数中用到的ebp寄存器的内容,恢复到函数调用前的状态。在进入函数处理之前,无法确定ebp寄存器用到了什么地方,但由于函数内部也会用到eb
阅读全文
摘要:代码清单 10-1 中列出的C语言源代码中,有一个处理是在变量c中存储 AddNum 函数的返回值,不过在汇编语言的源代码中,并没有与此对应的处理。这是因为编译器有最优化功能。最优化功能是编译器在本地代码上费尽功夫实现的,其目的是让编译后的程序运行速度更快、文件更小。在代码清单 10-1 中,由于存
阅读全文
摘要:程序运行时,会在内存上申请分配一个称为栈的数据空间。栈有“干草堆积如山”的意思。即数据在存储时是从内存的下层(大的地址编号)逐渐往上层(小的地址编号)累积,读出时则是按照从上往下的顺利进行(图10-3)的。 栈是存储临时数据的区域,它的特点是通过push指令和pop指令进行数据的存储和读出。往栈中存
阅读全文
摘要:指令中最常使用的是对寄存器和内存进行数据存储的mov指令。 mov指令的两个操作数,分别用来指定数据的存储地和读出源。操作数中可以指定寄存器、常数、标签(附加在地址前),以及用方括号(【】)围起来的这些内容。如果指定了没有用方括号围起来的内容,就表示对该值进行处理;如果指定了用方括号围起来的内容,方
阅读全文
摘要:在汇编语言中,1行表示对CPU的一个指令。汇编语言指令的语法结构是操作码+操作数(或只有操作码没有操作数的指令)。 能够使用任何形式的操作码,是由CPU的种类决定的。 本地代码加载到内存才能运行。 寄存器是CPU中的存储区域,寄存器具有存储指令和数据的功能,也有运算功能。
阅读全文
摘要:汇编语言的源代码,是由转换成本地代码的指令(即操作码)和针对汇编器的伪指令构成的。伪指令负责把程序的构造及汇编的方法指示给汇编器(转换程序)。伪指令本身是无法汇编转换成本地代码的。这里我们把代码清单10-2中用到的伪指令部分摘出,如代码清单10-3所示。 由伪指令 segment和ends围起来的部
阅读全文
摘要:除了将本地代码进行反汇编这一方法外,通过其他方式也可以获取汇编语言的源代码。 大部分C语言编译器,都可以把利用C语言编写的源代码转换成汇编语言的源代码,而不是本地代码。利用该功能,就可以对C语言的源代码和汇编语言的源代码进行比较研究。笔者在学生时代的报告中,使用的便是该功能。Borland C++中
阅读全文
摘要:在加法运算的本地代码中加上add(addition的缩写)、在比较运算的本地代码中加上cmp(compare的缩写)等。这些缩写称为助记符,使用助记符的编程语言称为汇编语言。通过查看汇编语言编写的源代码和查看本地代码的源代码,是同一级别的。用汇编语言编写的源代码,最终也必须要转换成本地代码才能运行。
阅读全文
摘要:通过使用操作系统提供的系统调用,程序员就没必要编写直接控制硬件的程序了。 通过使用高级编程语言,有时甚至也无需考虑系统调用的存在。这是因为操作系统和高级编程语言能够使硬件抽象化。硬件抽象化的具体实例。代码清单 9-2 是用C 语言编写的往文件中写人字符串的应用。fopen()是用来打开文件的函数,f
阅读全文
摘要:操作系统的硬件控制功能,通常是通过一些小的函数集合体的形式来提供的。这些函数及调用函数的行为统称为系统调用,即应用对操作系统的功能进行调用(call)。 C 语言等高级编程语言并不依存于特定的操作系统。这是因为人们希望不管是 Windows还是 Linux,都能使用几乎相同的源代码。因此高级编程语言
阅读全文
摘要:制作应用的程序员们意识到一点:制作的不是硬件,而是利用操作系统功能的应用。 代码清单9-1 表示的是,在 Windows 操作系统下,用C语言制作一个具有表示当前时间功能的应用。time()是用来取得当前日期和时间的函数,printf() 是用来在显示器上显示字符串的函数。程序的运行结果如图 9-4
阅读全文
摘要:操作系统的原型:仅具有加载和运行功能的监控程序。 通过事先启动监控程序,程序员就可以根据需要的各种程序加载到内存中运行。如下图: 在利用监控程序编写程序的过程中,发现很多程序都要共通的部分。因此,基本的输入输出部分的程序就被追加到了监控程序中。初期的操作系统就这样诞生了(图 9-2 )。 为了方便程
阅读全文
摘要:Q:编译器和解释器有什么不同?A:编译器是在运行前对所有源代码进行解释处理的。而解释器则是在运行时对源代码的内容一行一行地进行解释处理的。 Q:“分割编译”指的是什么?A:将整个程序分为多个源代码来编写,然后分别进行编译,最后链接成一个EXE文件。这样每个源代码都相对变短,便于程序管理。 Q:“Bu
阅读全文
摘要:当程序加载到内存后,还会生成栈和堆。栈是用来存储函数内部临时使用的变量(局部变量),以及函数调用时所用的参数的内存区域。堆是用来存储程序运行时的任意数据及对象的内存领域(图8-10)。 EXE文件中并不存在栈及堆的组。栈和堆需要的内存空间是在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++)来看一下编译和链接是如何进行的。 Borland C++的编译器是b
阅读全文
摘要:能够把C 语言等高级编程语言编写的源代码转换成本地代码的程序称为编译器。每个编写源代码的编程语言都需要其专用的编译器将 C语言编写的源代码转换成本地代码的编译器称为 C 编译器。 编译器首先读入代码的内容,然后再把源代码转换成本地代码编译器中就好像有一个源代码同本地代码的对应表。但实际上,仅仅靠对应
阅读全文
摘要:Windows中EXE文件的程序内容,使用的就是本地代码。 用记事本打开有代码清单8-1的内容转换成本地代码得到的EXE文件(Samplel.exe),页面显示情况如图8-3所示。 上面本地代码内容是人类无法理解的。所以用C语言等编程语言来编写源代码,然后再将源代码转换成本地代码这一方法。 接下来,
阅读全文
摘要:代码清单8-1。这是一个用C语言记述的Windows程序。该程序运行后,会把123和456的平均值289.5显示在消息框(图8-1)中。 类似于代码清单8-1这样,用某种编程语言的程序就称为源代码,保存源代码的文件称为源文件。 代码清单8-1的源代码是无法直接运行的。这是因为,CPU能直接解析并运行
阅读全文
摘要:程序的运行环境中,存在着名为BIOS(Basic Input/Output System)的系统。BIOS存储在ROM中,是预先内置在计算机主机内部的程序。BIOS除了键盘、磁盘、显卡等基本控制程序外,还有启动“引导程序”的功能。引导程序是存储在启动驱动器起始区域的小程序。操作系统的启动驱动器一般是
阅读全文
摘要:一、不通过移植,也能利用虚拟机软件来运行其他操作系统的应用。 通过利用该虚拟机,我们就可以在Macintosh的Mac操作系统上运行Windows应用了。Virtual PC for MAC 可以使Macintosh这一硬件变得同AT兼容机一样,从而能在该硬件上安装Windows。(Macintos
阅读全文
摘要:Unix系列操作系统FreeBSD中,存在一种名为Ports的机制。该机制能够结合当前运行的硬件环境来编译应用的源代码,进而得到可以运行的本地代码系统。如果目标应用的源代码没有在硬件上的话,Ports就会自动使用 FTP"连接到相关站点来下载代码(图7-5)。 通过使用Ports可以利用的程序源代码
阅读全文
摘要:应用软件则必须根据不同的操作系统类型来专门开发。CPU的类型不同,所对应的机器语言也不同,同样的道理,操作系统的类型不同,应用程序向操作系统传递指令的途径也是不同的。 应用程序向操作系统传递指令的途径称为API。(API也称为“系统调用”,是应用调用操作系统功能的手段。) Windows及Unix系
阅读全文
摘要:计算机的硬件并不仅仅是由CPU构成的,还包括用于存储程序指令和数据的内存,以及通过1/O连接的键盘、显示器、硬盘、打印机等外围设备。 而计算机是如何控制这些外围设备的呢?这和计算机的机型有着很大的关系。 MS-DOS(Microsoft Disk Operating System)是20世纪80年代
阅读全文
摘要:由于同一个程序能被大量用户使用,所以说程序具有很大的价值。但是,如果运行环境不同,程序是无法运行的。 如表7-1所示:在表示程序的运行环境时,列出了Operating System(操作系统)和计算机的主机(硬件)两项,由此知道运行环境是这两者的综合。也就是说,操作系统和硬件决定了程序的运行环境。
阅读全文
摘要:图像文件的数据形式: 图像文件的使用目的:通常是把图像数据输出到显示器、打印机等设备上。Windows的标准图像数据形式为BMP,是完全未压缩的。由于显示器及打印机输出的bit (点)是可以直接映射(mapping)的,因此便有了BMP=bitmap这一名称。 除BMP格式以外,还有其他各种格式的图
阅读全文
摘要:通过图6-5的步骤2可以发现,在用枝条连接数据时,我们是从出现频率较低的数据开始的,这就意味着出现频率越低的数据到达根部的枝条数就越多。而枝条数越多,编码的位数也就随之增多了。 使用哈夫曼树后,出现频率越高的数据所占用的数据位数就越少,而且数据的区分也可以很清晰地实现。 哈夫曼算法可以对数据进行区分
阅读全文
摘要:莫尔斯编码是根据日常文本中各字符的出现频率来决定表示各字符的编码的数据长度的。不过,该编码体系,对AAAAAABBCDDEEEEEF这样的特殊文本并不是最适合的。在莫尔斯编码中,E的数据长度最短,而在AAAAAABBCDDEEEEEF这个文本中,出现最频繁的是字符A。因此,应该给A分配数据长度最短的
阅读全文
摘要:压缩技巧:哈夫曼算法 哈夫曼算法是哈夫曼(D.A.Huffman)于1952年提出来的压缩算法。日本人比较常用的压缩软件LHA(LHA是吉崎荣泰开发的一款免费压缩软件),使用的就是哈夫曼算法。 为了更好地理解哈夫曼算法,首先要抛弃掉“半角英文数字的1个字符是1个字节(8位)的数据”这一概念。 文本文
阅读全文
摘要:在实际的文本文件中,同样字符多次重复出现的情况并不多见。虽然针对相同数据经常连续出现的图像、文件等,RLE算法可以发挥不错的效果,但它并不适合文本文件的压缩。不过,因为该压缩机制非常简单,因此使用RLE算法的程序也相对更容易编写。 借助RLE算法对而各种文件进行压缩的结果: 通过上图可以看出,使用R
阅读全文
摘要:把文件内容用“数据×重复次数”的形式来表示的压缩方法称为RLE (Run Length Encoding,行程长度编码)算法(图6-2) RLE算法是一种很好的压缩方法,经常被用于压缩传真的图像等。因为图像文件本质上也是字节数据的集合体,所以可以用RLE算法来压缩。
阅读全文
摘要:文件储存的基本单位是1字节(=8位) DOC、LZH和TXT这些扩展名中LZH是压缩文件的扩展名。 文件内容用“数据的值×循环次数”来表示的压缩方法是RLE算法。 在Windows 计算机经常使用的SHIFT JIS字符编码中,1个半角英数是用1字节(=8位)的数据来表示的。 BMP(BITMAP)
阅读全文
摘要:磁盘的物理结构是指磁盘存储数据的形式。磁盘是通过把其物理表面划分成多个空间来使用的。划分的方式有扇区方式和可变长方式两种,前者是指将磁盘划分为固定长度的空间,后者则是指把磁盘划分为长度可变的空间。 一般的Windows计算机所使用的硬盘和软盘,采用的都是扇区方式。扇区方式中,把磁盘表面分成若干个同心
阅读全文
摘要:由于Windows具有多任务功能,在巨大的Windows操作系统中可以同时运行多个应用,因此,即使是512MB的内存,有时也无法保证流畅运行。Windows操作系统经常为内存不足所困。 像Windows这样,窗口的菜单及图表等都可以进行可视化操作的方式称为图形用户界面。Windows的前身MS-DO
阅读全文
摘要:虚拟内存是指把磁盘的一部分作为假想的内存来使用。这与磁盘缓存是假想的磁盘(实际上是内存)相对,虚拟内存是假想的内存(实际上是磁盘)。 通过借助虚拟内存,在内存不足时也可以运行程序。例如,在只剩下5MB内存空间的情况下也能运行10MB大小的程序。不过,就如本章开头所讲述的那样,CPU只能执行加载到内存
阅读全文
摘要:磁盘缓存指的是把从磁盘中读出的数据存储到内存空间中的方式。这样一来,当接下来需要读取同一数据时,就不用通过实际的磁盘,而是从磁盘缓存中把内容读出。使用磁盘缓存可以大大改善磁盘数据的访问速度。如下图: 磁盘缓存(disk cache):磁盘缓存的缓存(cache)是高速缓存、仓库的意思。 Window
阅读全文
摘要:从都具有存储程序命令和数据这点来看,内存和磁盘的功能是相同的。在计算机的5大部件( 一般把输入装置、输出装置、存储器、运算器和控制器这5种部件设备称为计算机的5大部件 )中,内存和磁盘也都被归类为存储部件。不过,利用电流来实现存储的内存,同利用磁效应来实现存储的磁盘,还是有差异的。而从存储容量来看,
阅读全文
摘要:二叉查找树是指在链表的基础上往数组中追加元素时,考虑到数据的大小关系,将其分成左右两个方向的表现形式。 例如,假设我们事先把50这个值保存到了数组中。那么,如果接下来的值比先前保存的数值大的话,就要将其放到右边,反之如果小的话就放在左边。但实际的内存并不会分成两个方向,这是在程序逻辑上实现的(图4-
阅读全文
摘要:链表和而叉查找树,但是不用考虑索引的顺序就可以对数组元素进行读写的方式。 链表,可以更加高效的对数组元素进行追加和删除处理。 二叉查找树,可以更加高效的对数组数据进行索引。 在数组的各个元素中,除了数据的值之外,通过为其附带上下一个元素的索引,即可实现链表。( 数据的值+下一个元素的索引=一个元素)
阅读全文
摘要:栈和队列 栈和队列,都可以不通过指定地址和索引来对数组的元素进行读写。需要临时保存计算过程中的数据、连接在计算机上的设备或者输入输出的数据时,都可以通过这些方法来使用内存。如果每次保存临时数据都需指定地址和索引,程序就会变得比较麻烦。 栈和队列的区别在于:数据出入的顺序是不同的。在对内存数据进行读写
阅读全文
摘要:数组是指多个同样数据类型的数据在内存中连续排列的形式。作为数组元素的各个数据会通过连续的编号被区分开来,这个编号称为索引(index)。指定索引后,就可以对该索引所对应地址的内存进行读写操作。而索引和内存地址的变换工作则是由编译器自动实现的。 代码清单4-3表示的是在C语言中定义char类型、sho
阅读全文
摘要:指针也是一种变量,它所表示的不是数据的值,而是存储着数据的内存的地址。通过使用指针,就可以对任意指定地址的数据进行读写。虽然前面所提到的假想内存IC中仅有10位地址信号,但大家在Windows计算机上使用的程序通常都是32位(4字节)的内存地址。这种情况下,指针变量的长度也是32位。 上图清单,是定
阅读全文
摘要:虽然内存的实体是内存IC,不过从程序员的角度来看,也可以把它假想成每层都存储着数据的楼房,并不需要过多地关注内存IC的电源和控制信号等。因此,之后的讲解中我们也同样会使用楼房图(或者与楼房相似的图)。内存为1KB时,表示的是如图4-3所示的有1024层的楼房(这里地址的值是从上往下逐渐变大,不过也有
阅读全文
摘要:计算机是进行数据处理的设备,而程序表示的就是处理顺序和数据结构。由于处理对象数据是存储在内存和磁盘上的,因此程序必须能自由地使用内存和磁盘。因此,大家有必要对内存和磁盘的构造有一个物理上的(硬件的)和逻辑上的(软件的)认识。 有十个地址信号引脚的内存IC(集成电路)可以指定的地址范围用二进制数来表示
阅读全文
摘要:二进制数和十六进制数的关系: 在以位为单位表示数据时,使用二进制数很方便,但如果位数太多,看起来就比较麻烦。因此,在实际程序中,也经常会用十六进制数来代替二进制数。在C语言程序中,只需在数值的开头加上Ox(0和x)就可以表示十六进制数。 二进制数的4位,正好相当于十六进制数的1位。例如,32位二进制
阅读全文
摘要:计算机计算出错的原因之一是,采用浮点数来处理小数(另外,也有因“位溢出”而造成计算错误的情况)。作为程序的数据类型,不管是使用单精度浮点数还是双精度浮点数,都存在计算出错的可能性。接下来将介绍两种避免该问题的方法。(1)是回避策略,即无视这些错误。 根据程序目的的不同,有时一些微小的偏差并不会造成什
阅读全文
摘要:在代码示例中,如何用单精度浮点数来表示十进制数0.75 该程序执行后,十进制数0.75用单精度浮点数来表示就变成了0-01111110-10000000000000000000000(图3-7)。 因为0.75是正数,所以符号位是0。指数部分的1111110是十进制数126,用EXCESS系统表现就
阅读全文
摘要:正则表达式: 尾数部分使用正则表达式(按照特定的规则来表示数据的形式即为正则表达式。除小数之外,字符串以及数据库等,也都有各自的正则表达式。),可以将表现形式多样的浮点数统一为一种表现形式。 例如,十进制数0.75有很多种表现形式,如图3-5 二进制数也是同样的道理,在二进制中,是将“小数点前面的值
阅读全文
摘要:像1011.0011这样带小数点的表现形式,在计算机内部是无法使用的。(计算机无法直接处理循环小数) 两种表示小数的数据类型,分别是双精度浮点数类型(用64位)、点精度浮点数类型(用32位)来表示全体小数。这些数据类型都采用浮点数来表示小数,那么浮点数究竟采用怎样的方式来表示小数呢? 浮点数是指用符
阅读全文
摘要:计算机之所以会出现运行错误,是因为“有一些十进制数的小数无法转换成二进制数”。例如十进制数0.1就无法用二进制数正确表示,小数点后面即使有几百位也无法正确表示。 不能正确表示的原因: 图3-2是小数点后四位能够用二进制数表示的数值范围为0.0000~0.1111(二进制数是连续的,十进制数是非连贯的
阅读全文
摘要:由于计算机内部所有的信息都是以二进制数的形式来处理的,因此在这一点上,整数和小数并无差别。不过,使用二进制数来表示整数和小数的方法却有很大的不同。 把1011.0011这个小数二进制数转换成十进制数。小数点前面部分的转换方法,只需将各数位数值和位权相乘的结果相加即可。 小数点后面部分的转换方法,也是
阅读全文
摘要:由心算得:0.1累加100次后的结果是10,但是由程序运行之后显示的结果不是10。 程序没有错,计算机也没有出现故障,当然C语言也没有问题,可为什么会出现这样的结果呢? 这时如果考虑下计算机处理小数的机制,就讲的通了。那么计算机内部是如何处理小数的呢?
阅读全文
摘要:将二进制数表示的信息作为四则运算的数值来处理就是算术。而像图形模式那样,将数值处理为单纯的0和1的罗列就是逻辑。 计算机能处理的运算,大体可分为算术运算和逻辑运算。算术运算是指加减乘除四则运算。逻辑运算是指对二进制数各数字位的0和1分别进行处的运算,包括逻辑非(NOT运算)、逻辑与(AND运算)、逻
阅读全文
摘要:右移有移位后在最高位补0和补1两种情况。当二进制数的值表示图形模式而非数值时,移位后需要在最高位补0。类似于霓虹灯往右滚动的效果。这就称为逻辑右移。例如图2-9 将二进制数作为带符号的数值进行运算时,移位后要在最高位填充移位前符号位的值(0或1)。这就称为算术右移。 如果数值是用补数表示的负数值,那
阅读全文
摘要:表示负数的方法和右移的方法: 用来填充右移后空出来的高位的数值,有0和1两种形式。 区分什么时候补0什么时候补1:用二进制数表示负数的方法即可 二进制数中表示负数值时,一般会把最高位作为符号来使用,因此我们把这个最高位称为符号位。 符号位是0时表示正数,是1时表示负数。 计算机在做减法运算时,实际上
阅读全文
摘要:和十进制数一样,四则运算同样也可以使用在二进制数中,只要注意逢2进位即可。 移位运算指的是将二进制数值的各数位进行左右移位(shift=移位)的运算。移位有左移(向高位方向)和右移(向低位方向)两种。在一次运算中,可以进行多个数位的移位操作。 <<表示左移, >>表示右移位,<<和>>运算符的左侧是
阅读全文
摘要:二进制数的值转换成十进制数的值,只需要将二进制数的各数位的值和位权相乘,然后将相乘的结果相加即可。 十进制数是以10为基数的计数方法,二进制数则是以2为基数的技术方法。
阅读全文
摘要:在C和Java等高级语言编写的程序中,数值、字符串和图像等信息在计算机内部都是以二进制数值的形式来表现的。也就是说,只要掌握了使用二进制数来表示信息的方法及其运算机制,也就自然能够了解程序的运行机制了。IC的一个引脚,只能表示两个状态。IC的这个特性,决定了计算机的信息数据只能用二进制数来处理。由于
阅读全文
摘要:CPU把基址寄存器+变址寄存器的值解释为实际查看的内存地址。变址寄存器的值就相当于高级编程语言程序中数组的索引功能。数组是指同样长度的数据在内存中进行连续排 列的数据构造。用一个数组名来表示全体数据,通过索引来区分数组的各个数据(元素)。例如,一10个元素的数组a,其中的各个 数组a数据就用 a[0
阅读全文
摘要:函数”调用处理是通过把程序计数器的值设定成函数的存储地址来实现的。不过,这和条件分支、循环的机制有所不同,因为单纯的跳转指令无法实现函数的调用。函数的调用需要在完成函数内部的处理后,处理流程再返回到函数调用点(函数调用指令的下一个地址)。因此,如果只是跳转到函数的入口地址,处理流程就不知道应该返回至
阅读全文
摘要:程序的流程分为顺序执行、条件分支和循环三种。 顺序执行是按照地址内容的顺序执行指令(每执行一个指令程序计数器的值就自动加1)。 条件分支是指根据条件执行任意地址的指令。 循环是指重复执行同一地址的指令。 若存在条件分支和循环,机器语言的指令就可以将程序计数器的值任意定为任意地址(不是+1)。 条件分
阅读全文
摘要:图1-4是程序起动时内存内容的模型。用户发出启动程序的指示后,Windows等操作系统会把硬盘中保存的程序复制到内存中,然后会将程序计数器(CPU寄存器的一种)设定为指定开始位置的地址,然后程序便开始运行。CPU每执行一个指令,程序计数器的值就会自动加1. 储存指令和数据的内存,是通过地址来划分的。
阅读全文
摘要:1.程序是把寄存器当作对象来描述的。 2.汇编语言采用助记符来编写程序。 3.机器语言是指CPU可以直接解释和执行的语言。 4.汇编语言和机器语言基本上是一一对应的。 通过上面这个代码例子可以看出:机器语言级别的程序是通过寄存器来处理的,也就是说在程序员看来CPU是寄存器的集合体 程序员眼中的CPU
阅读全文
摘要:CPU(中央处理器)相当于计算机的大脑,CPU和内存都是由许多晶体管组成的电子部件,通常称为IC(集成电路)。 CPU的内部是有寄存器,运算器,控制器,时钟组成的. CPU所负责的就是解释和运行最终转换成机器语言的程序内容 程序运行流程图:
阅读全文