CSAPP——信息的表示和处理

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

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

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

信息存储

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

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

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

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

十六进制

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

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

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

数据大小

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

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

intshortlong 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. 整型数据类型