2.1 信息存储
- 计算机在访问内存时并不直接访问单个的位,而是将8个位视为一个块,作为最小的可寻址的内存单位。
- c编译器维护类型信息,机器级程序不包含类型信息。
2.1.1 十六进制(hex)表示法
- 二进制过于冗长,二进制转十进制过于麻烦,故而使用十六进制。
- 使用数字0-9和字母a-f来表示
- C语言中十六进制数用0x开头表示
- 当x为2的n次方时,要将x转化为16进制数
将n表示为形如i+4j(0<=i<=3)的形式,则十六进制数最高位的数为1(i=0),2(i=1),4(i=2),8(i=3),后接j个0
如217:17=1+44,故i=1,j=4,得到的十六进制便是0x20000
2.1.2 字数据大小
- 字长:决定虚拟地址空间大小
字长为w,则该机器的虚拟地址为0~2w-1,程序最多访问2w个字节 - 不同位程序的区别在于编译器的不同
2.1.3 寻址和字节顺序
- 数据存入内存时遵循从右至左的顺序,而保存时分为大端法和小端法两种情况
大端法:先保存的数据在高地址,后保存的数据在低地址
小端法:先保存的数据在低地址,后保存的数据在高地址 - 要考虑大小端法的三种情况:
- 1.在不同端法的机器间传递信息时,要先将信息转换为网络标准进行传输
- 2.在检查机器级程序时
- 3.编写规避正常的类型系统的程序时。如下
#include <stdio.h>
typedef unsigned char *byte_pointer;
void show_bytes(byte_pointer start, size_t len)
{
size_t i;
for (size_t i = 0; i < len; i++)
{
printf("%.2x", start[i]);
}
printf("\n");
}
void show_int(int x)
{
show_bytes((byte_pointer)&x, sizeof(int));
}
void show_float(float x)
{
show_bytes((byte_pointer)&x, sizeof(float));
}
void show_pointer(void *x)
{
show_bytes((byte_pointer)&x, sizeof(void *));
}