CSAPP:信息的表和处理1
关键点:寻址、内存、磁盘、虚拟地址、物理地址、整型数组。
信息存储中的几个概念整型数据类型无符号数有符号数几个概念有符号数与无符号数之间转换基于栈与基于寄存器的区别
信息存储中的几个概念
内存
内存也被称为内存储器,其作用是用于暂时存放CPU中运算的数据,计算机中的所有程序都在内存中运行。包括只读存储器(ROM:闪存、磁盘)、随机存储器(DRAM:动态随机存储器、SRAM:静态随机存储器)和高速缓冲存储器(cache)。
- 物理内存
真实的硬件设备(内存条) - 虚拟内存
操作系统给应用程序制造了一个假象,让每个应用程序认为自己独享4G(假设32位cpu),这个4G是一个虚拟地址空间。操作系统复负责内存管理,完成物理内存与虚拟内存之间的映射
地址
如果把内存比作一个个小房间,那么地址就是每个房间的编号。地址总线决定寻址范围,32位CPU寻址范围位0x00000000~0xFFFFFFFF(4G)
寻址和字节顺序
- 小端模式(little endian):低地址存放低字节,高地址存放高字节。大多数Intel都是小端模式
1int x = 0x01234567;
2char *p =(char *)&x;
3printf("%d\r\n",*p);
4*p = 0x67;
5*(p+1) = 0x45;
6*(p+2) = 0x23;
7*(p+3) = 0x01;
- 大端模式(big endian):低地址存放高字节,高地址存放低字节。
1int x = 0x01234567;
2char *p =(char *)&x;
3printf("%d\r\n",*p);
4*p = 0x01;
5*(p+1) = 0x23;
6*(p+2) = 0x45;
7*(p+3) = 0x67;
- 字节顺序:大小端模式可能造成的问题
- 网络字节序
- 强制类型转换或者联合(union)需要注意。
整型数据类型
无符号数
假设一个整数数据类型有w位。则其数据范围位为0~。32位平台下long = int ,64位平台下long站8位。
32位平台
数据类型 | 位数 | 最小值 | 最大值 |
---|---|---|---|
unsigned char | 8 | 0 | 255 |
unsigned short | 16 | 0 | 65535 |
unsigned int | 32 | 0 | 4294967295 |
unsigned long | 32 | 0 | 4294967295 |
uint32_t | 32 | 0 | 4294967295 |
uint64_t | 64 | 0 | 18446744073709551615 |
64位平台
数据类型 | 位数 | 最小值 | 最大值 |
---|---|---|---|
unsigned char | 8 | 0 | 255 |
unsigned short | 16 | 0 | 65535 |
unsigned int | 32 | 0 | 4294967295 |
unsigned long | 64 | 0 | 18446744073709551615 |
uint32_t | 32 | 0 | 4294967295 |
uint64_t | 64 | 0 | 18446744073709551615 |
有符号数
假设一个整数数据类型有w位。则其数据范围位为~.有符号数+无符号数 =
32位平台
数据类型 | 位数 | 最小值 | 最大值 |
---|---|---|---|
char | 8 | -128 | 127 |
short | 16 | -32768 | 32767 |
int | 32 | -2147483648 | 2147483647 |
long | 32 | -2147483648 | 2147483647 |
int32_t | 32 | -2147483648 | -2147483647 |
int64_t | 64 | -9223372036854775808 | 9223372036854775808 |
64位平台
数据类型 | 位数 | 最小值 | 最大值 |
---|---|---|---|
char | 8 | -128 | 127 |
short | 16 | -32768 | 32767 |
int | 32 | -2147483648 | 2147483647 |
long | 64 | -9223372036854775808 | 9223372036854775808 |
int32_t | 32 | -2147483648 | 2147483647 |
int64_t | 64 | -9223372036854775808 | 9223372036854775808 |
几个概念
数值在计算机中都是以补码形式存在的。
- 原码:符号位加上真值的绝对值。即第一位表示符号位,其余位表示值
- 反码:正数反码等于其原码(本身),负数反码在其原码基础上,符号位不变,其余各位取反。
- 补码:整数补码等于本身,负数 = 反码 + 1。
数值 | 原码 | 反码 | 补码 |
---|---|---|---|
85 | 01010101 | 01010101 | 01010101 |
-85 | 11010101 | 10101010 | 10101011 |
有符号数与无符号数之间转换
实际上是无符号数与补码之间的转换。-85 = 10101011 = 171U。一个w位的有符号数,假设其值位X(负数),其对应的无符号值为Y,则有:
基于栈与基于寄存器的区别
- 可移植性:基于寄存器的CPU架构,依赖于平台,寄存器指令不同。
- 不用考虑寄存器分配问题:基于栈的架构,不用考虑寄存器