0%

深入理解计算机系统第二章 笔记

信息的表示和处理

信息存储

二进制表示法、十六进制表示法

十六进制下每个数位上的数字可单独展开为4个二进制的数,从而快速转换成二进制数字

字数据大小

位/比特——>字节——>字

每台计算机都有一个字长,指明指针数据的标称大小,字长决定的最重要的系统参数就是虚拟地址空间最大大小,对于字长32位机器来说,虚拟地址空间最大大小为 2^32(0–2^32-1)byte,也就是4GB。(字长32位,最多对应2^32个地址,计算机存储数据的最小可寻址内存单位是字节,内存(虚拟内存)中每个字节都有唯一的数字来标识-地址,也就是说1个地址对应空间大小为1字节)

关于char,C的数据类型char表示一个单独的字节,尽管char由于它可以存储文本串中的单个字符而得名,但它也能用来存储整数值。

寻址和字节数据

多字节对象被存储为连续的字节序列,对象的地址就是所用字节中最小的地址(开头的地址),排列对象内容有大端法和小端法两种方法。

大多数intel兼容机型一般采用小端法存储,比如 int num=0x01234567,要用四个字节存储,假设67放在地址0x100处,那么45->0x101,23->0x102,01->0x103。大端法存储反过来。

运算

布尔代数 非 ~ , 且 & , 或 | , 异或 ^ 。C语言支持按位进行布尔运算也就是位级运算。

逻辑运算 C语言单独提供逻辑运算符号 || , && , !,默认非零的参数表示true,0表示false。

移位运算 左移 右移,右移又分为逻辑右移和算术右移。有符号数一般使用算术右移,无符号数必须使用逻辑右移。

整数表示

无符号整数表示

无符号整数不包括负数,正常二进制编码表示即可

有符号整数表示

一般有反码 原码 补码三种表示方法,补码表示最常见。原码一般用来表示浮点数。

补码表示,最高位(w位)的权重为-2^w,而不是正的,其他位的权重不变。

强制转换

将有符号整数和无符号整数强制互相转换时,底层源码也就是位模式不变,只是解释的方式变了。

对于C来说,如果一个运算数是有符号的而另外一个是无符号的,那么C会隐式将有符号参数转换为无符号参数。 除非特别指明 比如 unsigned int 或者 0x123u (末尾的u表示无符号,这是个无符号常量),否则大多数整数数字默认有符号。

下面是对于32位机器上最大int类型整数和最小int类型整数的写法(比较奇怪

1
2
#define INT_MAX  2147483647 //  2^31-1,底层编码为 0x7FFFFFFF,除了第三十二位为0 其他位均为1
#define INT_MIN (-INT_MAX - 1)

整数的扩展和截断

书上的内容易于理解,不在赘述。

整数运算

我的理解,本质都是正常运算(十进制正常运算)后用二进制编码表示,溢出的位进行截断处理

唯一值得一提的是

  1. 两个相同的位级编码,分别经过无符号乘法和补码乘法(有符号)后,不论是否溢出进行截断处理后,得到结果的位级编码仍然一样。这就是 无符号和补码乘法的位级等价性。
  2. 乘以2的n次幂用左移n位实现,除以2的n次幂,无符号数逻辑右移n位实现,有符号数算术右移n位实现。

浮点数

在学习数值分析中了解的很深入了,在阅读时略过了这部分内容。