《计算机科学导论》第二章 综述

本文概述了计算机中信息的表示与处理,包括信息存储、十六进制表示、字数据大小、寻址和字节顺序、字符串以及布尔运算。讨论了计算机如何使用字节作为最小寻址单位,以及整数和浮点数的表示。提到了不同计算机系统中字长、数据类型的差异,以及大端和小端模式的概念。

信息的表示与处理

信息存储

大多数计算机使用8位块(字节byte)作为最小的可寻址内存单位,而非直接访问内存中单独的位。虚拟内存是内存被机器级程序抽象化为一个很大的字节数组的名称,内存的每个字节都由一个唯一的数字标识,被称作地址。这些地址的集合叫做虚拟地址空间
编译器和运行时系统将存储器空间划分为更可管理的单元,来存放不同的程序对象(每个程序对下可以简单的被看做一个程序块,而程序本身就是是一个字节序列),这种管理就是建立在虚拟地址空间中之上的。比如C语言中的指针的值就是某个存储块的首个字节地址。

十六进制表示

计算机内信息是以二进制的方式被存储起来的,如果我们用二进制来表示这些信息所在的内存地址或是信息字节序列本身,因为一个字节等于8位,那么表示会相当繁琐,又由于十进制与二进制的转换不方便,因此使用十六进制来描述位模式将更方便。

编写机器级程序的一个常见人物就是在位模式的十进制、二进制和十六进制表示之间人工转换。

字数据大小

每台计算机都有一个字长(word size),用来指明指针数据的标称大小,因为虚拟地址是以这样的一个字来编码的。我们通常所说的电脑是64位或32位指的就是这个字长,从计算机的硬件组成来说,字长是总线携带的定长字节块的长度,总线以每个字长的信息在各个硬件之间传递,理论上来说,在其他条件一定的情况下,字长越大,传输速率越快。假设计算机的运行速度与信息在各硬件之间的传输时间线性成正比,也就是说字长越大,信息传输速率越快,计算机的运行速度也就越快。
一般而言,64位机器可以向后兼容,能运行64位和32位的程序。那么在以不同方式编译的程序中,数字的编码方式都有区别。以C语言为例,它支持整型和浮点数,有符号数和无符号数,在32位和64位编码方式上的区别主要体现在指针类型char *(4字节,8字节),长整型long(4字节,8字节)上,其他数字编码所占字节数没有区别。

寻址和字节顺序

对于跨越多字节的程序对象,我们需要知道这个对象的地址是什么,以及如何在内存中排列这些字节。在几乎所有的机器上,多字节对象都被存储为连续的字节序列,对象的地址为所使用字节中最小的地址。
根据排列一个对象所用字节的规则不同,有两种不同的对象的位表示方法,一种叫做小端法,一种叫做大端法,规则区别在于是从地址的最低有效位开始表示,还是从最高有效位开始。例如:小端模式的机器上对象地址表示为0x01 23 45 67, 在支持大端模式的机器上,则表示为0x67 45 23 01。

大端法(big endian)和小端法(little endian)的叫法来源于格列佛游记中一段战争因从哪一端吃鸡蛋而引发的讽刺性描写。

C语言支持typedef自定义数据类型,避免影响深度嵌套的类型声明的代码可读性。C语言使用‘&’符号作为取地址运算符,来创建一个指针。int *ip声明的是一个叫做·ip·的int变量,并定义了一个int类型的指针指向该变量,该指针可以被表示为&ip

字符串

C语言中字符串被编码为一个以null(其值为0)字符解围的字符数组,每个字符都由某个标准编码来表示,最常见的是ASCII字符码。

表示代码

程序代码在不同类型机器上编译时,所生成的机器代码是不同的,因此无法用二进制代码在不同机器间进行移植,而需要编译器识别机器型号再对源程序进行编译。
计算机系统的一个基本概念就是,从机器的角度来看,程序仅仅只是字节序列。

布尔运算|位级运算|逻辑运算|移位运算

布尔运算是一种将逻辑值编码为二进制1和0的一种代数,离散数学就是基于布尔运算的一门学科,专门来研究逻辑推理的基本原则。布尔运算扩展到位向量的运算就是位级运算。他们的基本运算符号包括4个:~(逻辑非¬),&(逻辑与∧),|(逻辑或∨),^(逻辑异或⊕) 。
位级运算的一个常见用法是实现掩码运算,应用加法逆元(a^a=0).

逻辑运算和位级运算的区别

  1. 功能不同。逻辑运算和位级运算各自都有运算符号对应于命题逻辑的OR、AND和NOT,但运算规则上,逻辑运算认为所有非零参数都表示TRUE,参数0表示FALSE,也就是说逻辑运算的结果只为0或1,分别代表FALSE和TRUE;而位级运算按位进行布尔运算得出的是一个确定值,该值就是布尔运算的结果。
  2. 逻辑运算的特殊性质。对应同一命题逻辑的各自运算符号,比如代表OR的|||,对于前者,逻辑运算如果第一个参数求职时就能确定表达式结果,就不会再对第二个参数求值。

移位运算相比另外几个容易区分,移位运算的作用主要体现在表达式中乘法运算乘以一个常数的时候,因为乘法运算的编译器会自动将常数转换为移位和加法/减法运算的结合。

整数表示和运算

整数表示和运算的重难点在于理解整数的强制类型转换带来的编码 问题,以及关系运算过程中的溢出截断问题。

首先,根据所需整数类型的不同,整数数据类型有不同长度,有无符号之分,所代表的取值范围也有所不同。对于有符号数来说,正整数总比负整数少一个。比如C语言中整数范围的补码表示。

define INT_MAX	   2147483647
define INT_MIN	   (-INT_MAX - 1)

其次,对于有符号数来说,补码 形式是计算机最常见的表示方式,在这个定义中,将字的最高有效位解释为负权。除此之外,还有反码原码 两种有符号数的表示形式。
假设我们接下来的所有分析都是在以补码形式表示有符号数的机器上进行。那么在整数的表示中,有时我们会进行强制类型的转换,有时也可能会出现我们不注意而进行的隐式转换,尤其是有符号数和无符号数之间的转换,从而可能导致内存的泄露等安全漏洞。要避免二者转换带来的溢出问题,要尽量避免使用无符号数。Java中只支持有符号数。
但在一些特殊情况下,当我们要把字仅仅看做是位的集合而没有数字意义时,无符号数会非常有用,比如地址的表示,以及实现模运算多精度运算 数字由字的数组表示时。

再者,要深层次的理解编码表示和运算背后的一般思路和含义。无论是有符号数和无符号数之间的转换,补码和无符号数的加减法运算和乘法运算,本质上都需要先转化为同一种编码形式,再参考相应的运算规则,得出一个值。同时要谨记通常书本上的十六进制和二进制一般都是用来描述位模式,没有数字意义,数字仍以十进制来表示。

浮点数

待续。。。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值