1. 首先,看看C中数字数据类型在32为机器和64为机器的字节数,针对大多数机器。
C声明 | 32位机器 | 64位机器 |
char | 1 | 1 |
short int | 2 | 2 |
int | 4 | 4 |
long int | 4 | 8 |
long long int | 8 | 8 |
char * | 4 | 8 |
float | 4 | 4 |
double | 8 | 8 |
对于虚拟地址空间,对于字长为w为的机器,程序最多访问2^w个字节。每一个地址(也可说是指针)的大小占用字长位。
2. 寻址和字节顺序
不同机器中一个对象的字节顺序与地址顺序对应之间不同,两个通用规则是:
大端模式:按照从最高有效字节到最低有效字节的顺序存储
小端模式:按照从最低有效字节到最高有效字节的顺序存储
例如 int x = 0X010203在Intel处理器的机器上有小端模式如下:
03 | 0x7ffc35e6c1ec |
02 | 0x7ffc35e6c1ed |
01 | 0x7ffc35e6c1ee |
00 | 0x7ffc35e6c1ef |
可以看出有效字节从最低到最高存储。大端模式相反!
下面进入c程序输出不同对象字节表示(参考书籍《深入理解计算机系统》):
/*定义函数处理不同类型以及字节输出函数*/ typedef unsigned char * byte_pointer; /*打印字节*/ void print_bytes(byte_pointer start, int len) { int i; for(i = 0; i < len; i++) { printf("%.2x", start[i]); printf(" %p\n", &start[i]); //可以显示对应字节所在位置 } } /*int型*/ void print_int(int A) { print_bytes((byte_pointer) &A, sizeof(int)); } /*float型*/ void print_float(float A) { print_bytes((byte_pointer) &A, sizeof(float)); } /*指针类型*/ void print_pointer(void *A) { print_bytes((byte_pointer) &A, sizeof(void *)); }
这段程序就对字节表示进行输出了,可以加深对指针内存的理解。