本文参考B站up主 九曲阑干 的系列视频【【CSAPP-深入理解计算机系统】2-1.信息的存储(上)】 https://www.bilibili.com/video/BV1tV411U7N3/?share_source=copy_web&vd_source=73f97624c2b3ff1eb41ea26fb86c72ee

信息存储

计算机一般使用 字节 作为最小的可寻址的内存单位

通常情况下,程序将内存视为一个非常大的数组,每个数组的元素是一个个的字节

每个字节的索引称为地址

image-20240507132402526

信息存储的基本单元——字节

一个字节(byte)由 8bit(位)组成

image-20240507132629817

我们通常把这种按照 位 来表示数据的方式称为:位模式

十六进制数表示的位模式

用二进制表示数据比较冗长,而采用十进制又不方便进行进制转换

因此,我们引入十六进制表示的位模式

image-20240507133105794

字长

字长决定了虚拟地址空间的最大值

对于一个字长为w的机器,虚拟地址的范围是0 ~ 2^w - 1

对于32位的机器而言,虚拟地址空间最大为4GB

对于64位的机器而言,虚拟地址空间最大为16EB

image-20240507133743722

寻址和字节顺序

对于跨越多字节的对象,他的地址是它所用的字节中的最小地址

两种字节存储法

假设从左到右是低地址到高地址

大端法:数的高位在前

小端法:数的低位在前

image-20240507134425285

字符串

C 语言字符串是以 null 字符结尾的字符数组,即 ‘\0’

image-20240507134826361

使用 show_bytes 可以打印字符串中每个字符在内存中所对应的存储信息

可以发现:结尾字符的十六进制表示为 0x00

(源码见《深入理解计算机系统》原书)

二进制代码

二进制代码是不兼容的,一般无法在不同机器间移植。从机器的角度来看,程序就是一个字节序列。

布尔运算

与、或、非、异或

image-20240507135424716

C语言支持按位进行布尔运算

逻辑运算

image-20240507135554591

逻辑运算认为所有非零的参数都为 True ,只有参数0表示 False

逻辑运算只有 True 和 False 两种结果

image-20240507135738752

移位运算

移位运算按照移位方向分为左移和右移

左移

左移就是丢弃高位,低位补零,比较简单

右移分两种情况

  • 逻辑右移
  • 算术右移

逻辑右移

丢弃最低的1位,并在左端补0

image-20240507140222341

image-20240507140243336

算术右移

算术右移关注最高位的值,分两种情况处理

  1. 如果最高位为0,那么算术右移与逻辑右移一样,丢弃低位,高位补0

image-20240507140442816

  1. 当最高位为1,那么右移后左端需要补1,而不是补0

    image-20240507140607535

    image-20240507140715659

    image-20240507140755445

实际上,几乎所有的编译器以及机器的组合都这样处理:

  • 有符号数使用算数右移

  • 无符号数使用逻辑右移