csapp学习笔记——第二章信息的表示和处理

发布时间 2023-08-26 09:04:42作者: Curitaos

csapp学习笔记——第二章信息的表示和处理

本章主要讲了计算机系统中的数据的表示方法以及在为什么会出现相关的转化问题(float int double等互相转换)。

计算机系统中的数字表示方法

在现实世界中我们使用的是十进制的表示方法,而在计算机系统中我们则使用的是2进制的表示方法(构造储存以及处理信息的工具是二进制比较好实现,比如我们可以用电平的高低来表示1和0,纸带有无孔来表示1和0),我们可以赋予这些二进制数一些特殊的解释,即赋予这些位特殊的含义,来表示出我们所需要的东西。

在有三种数字表示很常见:

1.无符号:传统的二进制表示方法,表示的是大于等于0的整数,只有一种溢出方式

2.补码:与无符号的表示方法不同的是它的最高位表示的是符号位(即1为负0为正)相对应的是它的表示的Tmax<Umax,可能出现正溢出和负溢出这两种溢出方式

3.浮点数:编码是表示实数的科学记数法的以 2 为基数的版本。

溢出

在计算机系统中我们使用的是有限的位来表示数字编码,所以当计算后的数字结果太大时就会出现溢出,

200∗300∗400∗500会得出结果 -884901888。这违背了整数运算的特性,计算一组正数的乘积不应产生一个负的结果。同时计算机系统也满足了人们所知的整数运算的性质,下图得到的答案与我们之前的式子相同。

同时浮点的运算有着与整数类型完全不同的数学属性虽然溢出会产生特殊的值 +∞,但是一组正数的乘积总是正的。由于表示的精度有限,浮点运算是不可结合的。例如,在大多数机器上,C 表达式

(3.14+1e20)−1e20求得的值会是 0.0, 而3.14+(1e20−1e20)求得的值会是 3.14。整数运算和浮点数运算会有不同的数学属性是因为它们处理数字表示有限性的方式不同——整数的表示虽然只能编码一个相对较小的数值范围,但是这种表示是精确的;而浮点数虽然可以编码一个较大的数值范围,但是这种表示只是近似的。

2.1 信息存储

计算机一般使用字节作为最小的可寻址的内存单位。
在机器级程序中不包含关于数据类型的信息。
指针的值是某个存储块的第一个字节的虚拟地址。
每个程序对象可以视为一个字节块。

2.11十六进制表示

0x开头由0-9A-F表试从0到15

字长

每个计算机有对应的字长,虚拟地址用一个字来编码,所以字长决定了虚拟地址空间的大小。64 位机器的指针类型长度为 8 字节
32位机器的虚拟地址空间为 4GB,64 位字长的虚拟地址空间位 16 EB。
int32_t 和 int64_t 类型分别为 4 字节和 8 字节,不受机器影响。使用确定大小的整数类型很有用。
对 32 位和 64 位机器而言,char、short、int、long long 长度都是一样的,为 1,2,4,8。long 的长度不一样。
float 和 double 的长度一样,分别为 4,8
程序对 char 有无符号一般不敏感。

 

 

 

 

 

补充

1.C++ 编程语言建立在 C 语言基础之上,它们使用完全相同的数字表示和运算。本章中关于 C 的所有内容对 C++ 都有效。另一方面,Java 语言创造了一套新的数字表示和运算标准。C 标准的设计允许多种实现方式,而 Java 标准在数据的格式和编码上是非常精确具体的。本章中多处着重介绍了 Java 支持的表示和运算。