CSAPP——信息的表示和处理

  • 无符号编码基于传统的二进制表示法,表示大于或者等于零的数字
  • 补码编码是表示有符号整数最常见的方式
  • 浮点数编码是表示实数的科学记数法的以二为基数的版本

整数的计算机运算满足人们熟知的真正整数运算的规律

由于表示的进度有限,浮点运算不可结合(整数范围有限但精确,浮点数范围较大但是近似)

信息存储

机器级程序将存储器视为一个非常大的字节数组,称为虚拟存储器

存储器的每个字节都有一个唯一的数字来标识,成为它的地址

所有可能的地址集合称为虚拟地址空间

程序对象:程序数据,指令和控制信息

十六进制

在C语言中,以0x或0X开头的数字常量被认为是16进制的值。字符’A’~’F’既可以是大写也可以是小写,甚至是大小写混合。

字

每台计算机都有一个字长,指明整数和指针数据的标称大小。

因为虚拟地址是以这样的一个字来编码的,所以字长决定的最重要的系统参数就是虚拟地址空间的最大大小。

数据大小

C语言支持整数和浮点数的多种数据格式

char存储单个字符,也可以用来存储整数值。

int,short,long long,短整数分配两个字节,不加限定的int分配四个字节,长整数使用机器的全字长。

指针使用机器的全字长

单精度(float)和双精度(double),格式分别使用4字节和8字节

C申明 32位机器 64位机器
char 1 1
short int 2 2
int 4 4
long int 4 8
long long int 8 8
char * 4 8
float 4 4
double 8 8

可移植的一个方面就是使程序对不同数据类型的确切大小不敏感。

寻址和字节顺序

在几乎所有的机器上,多字节对象都被存储为连续的字节序列,对象的地址为所使用字节中最小的地址。
这个是通用的原则,不管是大端还是小端都是这样的。

大端就是对象的地址处是最高字节然后顺序存储,小端就是对象的地址处是最小字节然后顺序存储。

不管是大端还是小端,对象的地址都是所有字节的地址中最小的地址。

字节顺序在大部分的时候是不可见的,对于应用程序员来说。但有3类情况变得可见。

  • 网络传送,现在的解决方法是网络传送时是网络传送的标准,大端和小端都要在传送时变成网络标准,接受时再变回去。
  • 阅读表示整数数据的字节序列时
  • 当编写规避正常的类型系统程序时,类型强制转换,类型转化就可以看作是地址不变,但取的字节书目变了。当然大端和小端就会显示出差别。大多数应用编程都强烈不推荐这种编码技巧,但是它们对系统级编程来说非常有用甚至是必需的。

sizeof(T)返回存储 一个类型为T的对象所需要的字节数。sizeof是运算符,比如+。

表示字符串

c语言中字符串被编码为一个以null字符结尾的字符数组,null字符在ASCII中是0,也就是说所有的c语言字符串最后一个字节都是0。

Unicode联合会的Unicode标准目前字库包括十万个字符。

基本编码,也成为Unicode的“统一字符集“使用32位来表示字符,
UTF-8表示将每个字符编码为一个字节序列,所有的ASCII字节序列用ASCII码表示和UTF-8表示一样。

Java使用Unicode来表示字符串,也就是一个字符4字节,浪费。

表示代码

不同的机器类型使用不同的且不兼容的指令和编码方式,二进制代码是不兼容的,即使一样的程序,编译出来的机器级代码也是不一样的。

二进制代码很少能在不同机器和操作系统组合之间移植。

所以说,不可移植在于不同的机器硬件和操作系统的组合。

布尔代数简介

布尔代数有很多有用的结论,记住就可以了,最好的一个是a^(b^a)=b。

位向量一个很有用的应用就是表示有限集合。

c语言中的位级运算

既然是位级运算,那就是对位的,不论操作数是什么类型,位级运算符不关心,就是对位的。位级运算的一个常见应用就是实现掩码运算

掩码是一个位模式,表示从一个字中选出的位的集合。

c语言中的逻辑运算

c语言中的移位操作中,向左移位是很简单的,丢弃高位的,低位补0,始终如此。
但向右移位有两种,一种是逻辑移位,一种是算术移位,逻辑移位高端补0,算术移位高端是1补1,是0补0。
存在两种右移,归根结底是机器提供了这两种形式。

c语言标准没有明确定义使用那种右移。但有其他的限制:无符号数据必须逻辑右移,有符号数据则不能确定。
但实际上,总存在典型值的,那就是几乎所有的编译器/机器组合对有符号数据都执行算术右移。

c语言标准也没有定义当移位(右移或者左移)的位数大于数据位数时该怎么做,典型值是取mod。比如32就变成了0,34变成了2。

整数表示

用位来编码整数的两种不同的方式:一种只能表示非负数,而另一种能够表示负数、0和正数。
这是两种最常用的,但当然还有其他的用位编码整数的方式,不说,不代表不存在,也不代表没人用,重点是这里,目前,最多的使用的编码整数的方式是这两种。

而且,这两种的数学属性和机器级实现方面密切关联。

整型数据类型

32位机和64位机上的c语言整数数据类型的典型字节数除了long之外都是一致的,char1,short2,int4,longlong8。
而long在32位是4字节,在64位是8字节。注意:这里是典型字节数。

文章目录
  1. 1. 信息存储
    1. 1.1. 十六进制
    2. 1.2. 字
    3. 1.3. 数据大小
    4. 1.4. 寻址和字节顺序
    5. 1.5. 表示字符串
    6. 1.6. 表示代码
    7. 1.7. 布尔代数简介
    8. 1.8. c语言中的位级运算
    9. 1.9. c语言中的逻辑运算
  2. 2. 整数表示
    1. 2.1. 整型数据类型