2.1 信息的存储
通常情况下,程序将内存视为一个非常大的数组,数组的元素是由一个个的字节Byte
组成,每个字节都有一个唯一的数字来表示,称为地址address
,所有地址的集合称为虚拟地址空间
2.1.1 进制
1个字节由8个位bit
组成,用十进制来表示范围是:0~255
,这种按照一位一位表示数据的方式称为位模式,使用二进制太冗长,所以引入十六进制
十六进制以
0X
或0x
开头
快速将2的n次方表示为十六进制数
20 = 1
21 = 10
22 = 100
23 = 1000
所以2的n次方就是1后面跟n个0,n可以表示为i+4j
,就是除以4,i
为余数,j
为商,i
只有三种情况,0对应0B->0H
,1对应10B->2H
,2对应100B->4H
,3对应1000B->8H
,后面再跟j
个0
例如:211,因为11=3+4*2
,所以是0x800
C语言支持整数和浮点数等多种数据类型,表格中列出了不同数据类型在32位机器和64位机器上所占字节数的大小
例如一个4字节的int
变量0x01234567
,所以需要占用0x100
、0x101
、0x102
和0x103
四个字节内存空间
大端法:最高有效字节存储在低地址处,所以是
01 23 45 67
小端法:最低有效字节存储在低地址处,所以是67 45 23 01
#include <stdio.h>
typedef unsigned char* byte_pointer;
void show_bytes(byte_pointer start, int len) {
for (int i = 0; i < len; i++)
printf(" %.2x", start[i]); // 两位十六进制
printf("\n");
}
void show_int(int x) {
show_bytes((byte_pointer)& x, sizeof(x));
}
int main() {
int x = 0x01234567;
show_int(x);
return 0;
}
// 67 45 23 01
从程序运行结果可以看出来是小端模式
2.1.2 移位操作
左移就是简单地左移,右端补0
右移分为逻辑右移和算术右移
- 逻辑右移左端补0
- 算术右移
- 最高位为0则补0
- 最高位为1则补1
大多数编译器对有符号数使用算术右移,对于无符号数,右移是逻辑右移