信息的表示和处理——信息存储
本文参考B站up主 九曲阑干 的系列视频【【CSAPP-深入理解计算机系统】2-1.信息的存储(上)】 https://www.bilibili.com/video/BV1tV411U7N3/?share_source=copy_web&vd_source=73f97624c2b3ff1eb41ea26fb86c72ee
信息存储
计算机一般使用 字节 作为最小的可寻址的内存单位
通常情况下,程序将内存视为一个非常大的数组,每个数组的元素是一个个的字节
每个字节的索引称为地址
信息存储的基本单元——字节
一个字节(byte)由 8bit(位)组成
我们通常把这种按照 位 来表示数据的方式称为:位模式
十六进制数表示的位模式
用二进制表示数据比较冗长,而采用十进制又不方便进行进制转换
因此,我们引入十六进制表示的位模式
字长
字长决定了虚拟地址空间的最大值
对于一个字长为w的机器,虚拟地址的范围是0 ~ 2^w - 1
对于32位的机器而言,虚拟地址空间最大为4GB
对于64位的机器而言,虚拟地址空间最大为16EB
寻址和字节顺序
对于跨越多字节的对象,他的地址是它所用的字节中的最小地址
两种字节存储法
假设从左到右是低地址到高地址
大端法:数的高位在前
小端法:数的低位在前
字符串
C 语言字符串是以 null 字符结尾的字符数组,即 ‘\0’
使用 show_bytes 可以打印字符串中每个字符在内存中所对应的存储信息
可以发现:结尾字符的十六进制表示为 0x00
(源码见《深入理解计算机系统》原书)
二进制代码
二进制代码是不兼容的,一般无法在不同机器间移植。从机器的角度来看,程序就是一个字节序列。
布尔运算
与、或、非、异或
C语言支持按位进行布尔运算
逻辑运算
逻辑运算认为所有非零的参数都为 True ,只有参数0表示 False
逻辑运算只有 True 和 False 两种结果
移位运算
移位运算按照移位方向分为左移和右移
左移
左移就是丢弃高位,低位补零,比较简单
右移分两种情况
- 逻辑右移
- 算术右移
逻辑右移
丢弃最低的1位,并在左端补0
算术右移
算术右移关注最高位的值,分两种情况处理
- 如果最高位为0,那么算术右移与逻辑右移一样,丢弃低位,高位补0
当最高位为1,那么右移后左端需要补1,而不是补0
实际上,几乎所有的编译器以及机器的组合都这样处理:
对有符号数使用算数右移
对无符号数使用逻辑右移