信息存储

大多数计算机使用1个字节(byte)作为计算机最小可寻址的单位。机器级别的程序将内存视为一个非常大的字节数组,称为虚拟内存。内存的每个字节都由一个唯一的数字来标识,称为地址。可以通过该图来表示:

CSAPP(二)—— 信息的表示与处理 - 图1

为什么需要虚拟地址?

物理地址就是内存中真实存在的地址,其实这个物理地址也是我们抽象出来的概念,不然不知道数据是存储在哪个字节中的。再回到代码,编译后要放到内存中,通常是从地址“0”开始,一个程序没问题,但是如果有多个程序怎么办呢?那个“0”地址内存被占用了。这个时候虚拟地址就登场了,操作系统会对虚拟地址和物理地址进行一个映射,让你误以为你程序是从“0”地址开始。

image.png

4位的CPU上有4根地址线,一个地址线有0和1,所以有2也就是16个地址。内存中最小单元是字节,一个地址就是一个字节,因此32位的CPU有多少个地址呢?2个地址,也就是4G

十六进制二进制互转

十六进制转二进制

将一个十六进制数转换为4位二进制数,从右边开始,左边不足4位补0
例如:0xa9,那么
a = 1010,9 = 1001
得到二进制10101001

二进制转十六进制

将二进制从右边开始分4位一组,左边不足4位补0
例如:10101001,那么
1010 = a,1001 = 9
得到十六进制0xa9

十六进制十进制互转

十六进制转十进制

用相应的16的幂乘以每个十六进制数
例如:0xa9,那么
10 16 9 * 16= 169
得到十进制数169

十进制转十六进制

将十进制数x反复除16会得到一个商x和余数r,然后继续用q反复进行逐个过程,得到剩下的数字
x = q 16 + r;
例如:169,那么
169 = 10
16 + 9
10 = 0 * 16 + 10
因为在十六进制中10用字幕a(A)表示,所以得到十六进制0xa9

字的大小

字长就是字的长度,一个字由一个或多个字节组成,一个字节等于8位,cpu在同一时间内处理二进制的位数,这个位数的长度就叫字长,比如一个cpu同时能处理32位,那么字长就是32,也就是同时能处理4个字节的数据,字长也是衡量计算机性能的一个标准

字长决定了虚拟地址空间的最大大小,对于一个字长为w位的机器而言,虚拟地址的范围为0~2-1,也就是说程序最多访问2个字节。

寻址和字节顺序

当一个程序对象比较大时就需要多个字节进行存储,我们称为跨字节存储。当多个字节来存储一个对象就涉及到排序问题,因为不同的排序方式表示不同的内容,所以要有排序规则,有2种排序规则,一种是小端法,一种是大端法。

大端法

在内存中从最高有效字节到最低有效字节开始排列,这种叫大端法。

小端法

在内存中从最低有效字节到最高有效字节开始排列,这种叫小端法。
**

布尔运算

与 (&):两个都是1才出1

或 (|):有1就出1

异或(^):有1才取反进行或

取反(~):0变1,1变0

浮点数

小数的表达方式其实有两种,一种是定点数,即规定小数点的位置,一种是浮点数,小数点的位置是可以变动的。

对浮点数使用IEEE标准754编码,理解浮点数先看下一个含小数的二进制是如何表现的,例如十进制小数11.05,用二进制来表示就是1011.1。

先复习一个概念:

一个数的负次方即为这个数正次方的倒数。如: 2=1/2

计算过程:
1x2+0x2+1x2+1x2+1x2= 8+0+2+1+0.5 = 11.05

IEEE的浮点标准可以用该公式来表示一个浮点数V:
CSAPP(二)—— 信息的表示与处理 - 图3

  • s是符号位,s=1负数,s=0正数,但一个数为0,符号位另做处理
  • M是一个二进制小数,取值范围是:1<= M < 2
  • E是对浮点数加权,是2的E次幂

将浮点数的位数划分为3个字段,分别由s,exp,frac来表示,下面是32位和64位中的表示:
image.png

具体转换过程,参考该文章,写的很通俗易懂了。

参考资料

请你相信我所说的都是错的