2019年2月22日 深入理解计算机系统(CS:APP)第二章 信息的表示和处理

数据位+解释可以定义数据,第二章主要介绍信息的存储、整数、浮点数的相关内容。

浮点数溢出将会成为正无穷大。


2.1 信息存储

(2.1.2 字、2.1.3 数据大小、2.1.4 寻址和字节顺序、2.1.5 表示字符串、2.1.6表示代码、2.1.7 布尔代数和环、2.1.8 C中的位运算\逻辑运算\位移)

1. 八个位(bit)组合成块成为字节(byte),作为最小的可寻址存储单位。

2. 单个字节的表示范围为 0~255(10进制整数),00 ~ FF (16进制),也就是说,十六进制一个字符表示4个bit。

3. 每台计算机会有字长(word size)概念,指明整数和指针的标称大小(nominal size),过去主要为32位,现在大部分是64位,也就是8字节。

4. 大小端(big endian \ little endian)的区别在于存储一个数据(字长,如int 0x12345678)时,地址从低到高,大端按字节从高到低,小端按字节从低到高存储。

5. 大小端目前涉及两个地方需要注意:A. 跨机器网络通信,需要转网络序或统一。 B. 阅读汇编或底层字节,主要注意大小端。

6. 通常我们使用 unsigned char * 作为指向字节的指针描述,声明每个字节都是一个非负正数。

7. 围绕二进制演化出的布尔代数,包含“与或非”三类主要运算,以及异或。

8. 环:<集合、运算符、单位元>,例如整数集合<Z,+,x,-,0,1>,布尔代数<{0,1},|,&,~,0,1 >

9. C语言在逻辑运算符中存在阻断特性,p&&*p++不会导致引用空指针。


2.2 整数的表示

1. 一个64位整数,最大值是2147483647,也就是21亿,无符号的话也就是42亿。

2. 为了让计算机支持带符号数的计算(减法),提出了反码和补码的概念。

3. 由于数字位表示及C语言中强转的特殊性,需要特别注意无符号整数(特别是在与有符号数的运算中)以及位移(位移操作在补位时存在一定规律而非完全补0)

4. 无符号整数在连续相加后会溢出,而有符号整数会出现正溢出和负溢出。

image

image

(这里可能比较难理解,举个栗子,在补码加法中,8+2=-6为正溢出,-2+-8=6为负溢出)


3. 浮点数

1. 如同十进制的小数是分为整数、小数部分,并且分别用10的n次幂来表示每个位置的值(n为整数而非正整数)。

2. 在计算机中的浮点数,采用2的n次幂(n为整数),每个位置为0、1表示,这样,采用x(y/z)的形式来不断逼近浮点数的目标值。

3. 举个栗子,计算机使用浮点数表示 1/5,近似值可以为 0.00110011(2次幂),即为 51/256 等于 0.19921875。

4. 关于浮点数的一个简单例子,在传统IA32处理器中,寄存器中可以保存扩展精度的浮点数(80位),因此,当出现寄存器和内存中双精度的浮点数比较时,就可能出现误差,总而导致不相等的情况。(O2优化开启时)

image

posted @ 2019-03-07 14:54  miuc  阅读(236)  评论(0编辑  收藏  举报