CSSAPP稀里糊涂的读书笔记(二)信息的表示和处理

xiaoxiao2025-05-14  56

本章主要讨论编码。

计算机将信息编码为位(比特),通常组织成字节序列。有不同的编码方式用来表示整数、实数和字符串。不同的计算机模型在编码数字和多字节数据中的字节顺序时使用不同的约定。

无符号(unsigned)编码基于传统的二进制表示法,表示大于或者等于零的数字。补码(two’s-complement)编码是表示有符号整数的最常见的方式,有符号整数就是可以为正或者为负的数字。浮点数(floating-point)编码是表示实数的科学计数法的以2为基数的版本。

机器级程序将内存视为一个非常大的字节数组,成为虚拟内存。内存的每个字节都由一个唯一的数字来标识,称为它的地址,所有可能地址的集合就称为虚拟地址空间。

每台计算机都有一个字长,指明指针数据的标称大小。因为虚拟地址是以这样的一个字来编码的,所以字长决定的最重要的系统参数就是虚拟地址空间的最大大小。

在几乎所有的机器上,多字节对象都被存储为连续的字节序列,对象的地址为所使用字节中最小的地址。

某些机器选择在内存中按照从最低有效字节到最高有效字节的顺序存储对象,称为小端法(little endian);而另一些机器则按照从最高有效字节到最低有效字节的顺序存储,称为大端法(big endian)。 123456 小端法:56 34 12 大端法:12 34 56

各种关于补码,整数的有无符号的原理和推导,又多又杂,理解起来还很困难,所以这里就不总结了,还是看书比较好。

表示数字的有限字长限制了可能的值的取值范围,结果运算可能溢出。补码表示提供了一种既能表示负数也能表示正数的灵活方法,同时使用了与执行无符号算术相同的位级实现,这些运算包括像加法、减法、乘法,甚至除法,无论运算数是以无符号形式还是以补码形式表示的,都有完全一样或者非常类似的位级行为。

IEEE浮点标准

当在int、float和double格式之间进行强制类型转换时,程序改变数值和位模式的原则如下(假设int是32位的):

从int转换成float,数字不会溢出,但是可能被舍入。从int或float转换成double,因为double有更大的范围(也就是可表示值得范围),也有更高得精度(也就是有效位数),所以能够保留精确的数值。从double转换成float,因为范围要小一些,所以值可能溢出成正无穷或负无穷。另外,由于精确度较小,它还可能被舍入。从float或者double转换成int,值将会向零舍入。进一步说,值可能会溢出。
转载请注明原文地址: https://www.6miu.com/read-5030110.html

最新回复(0)