编写如下程序:
#include <cstdio>
#include <iostream>
using namespace std;
int main()
{
int a = 10;
char b = 'a';
int c = 20;
printf("&a = 0x%08x \n", &a);
printf("&b = 0x%08x \n", &b);
printf("&c = 0x%08x \n", &c);
cout << endl;
char b1 = 'a';
int a1 = 10;
int c1 = 20;
printf("&a1 = 0x%08x \n", &a1);
printf("&b1 = 0x%08x \n", &b1);
printf("&c1 = 0x%08x \n", &c1);
cout << endl;
struct
{
int a;
char b;
int c;
} st;
st.a = 10;
st.b = 'a';
st.c = 20;
printf("&st = 0x%08x \n", &st);
printf("&st.a = 0x%08x \n", &st.a);
printf("&st.b = 0x%08x \n", &st.b);
printf("&st.c = 0x%08x \n", &st.c);
return 0;
}
结果如下所示:
&a = 0xbf94c368
&b = 0xbf94c36f
&c = 0xbf94c364
&a1 = 0xbf94c360
&b1 = 0xbf94c36e
&c1 = 0xbf94c35c
&st = 0xbf94c350
&st.a = 0xbf94c350
&st.b = 0xbf94c354
&st.c = 0xbf94c358
结果分析:
在C++中,函数局部变量所占用的空间是在栈中的,而栈空间是随着压入变量的增多,自高地址向低地址生长。按照变量声明的顺序,压栈的顺序应该是(a, b, c, b1, a1, c1, c),而实际上为了保证内存中的数据对齐,压栈的顺序变成了(b, b1, a, c, a1, c1, c)。
另外是关于大端与小端的问题。x86的CPU都是采用的小端存储方法。
大端模式(big-edian),big-endian:MSB存放在最低端的地址上。举例,双字节数0x1234以big-endian的方式存在起始地址0x00002000中:
| data |<-- address | 0x12 |<-- 0x00002000 | 0x34 |<-- 0x00002001
在Big-Endian中,对于bit序列中的序号编排方式如下(以双字节数0x8B8A为例):
bit | 0 1 2 3 4 5 6 7 | 8 9 10 11 12 13 14 15 | ------MSB----------------------------------LSB val | 1 0 0 0 1 0 1 1 | 1 0 0 0 1 0 1 0 | +--------------------------------------------+ = 0x 8 B 8 A
小端模式(little-endian),little-endian:LSB存放在最低端的地址上。举例,双字节数0x1234以little-endian的方式存在起始地址0x00002000中:
| data |<-- address | 0x34 |<-- 0x00002000 | 0x12 |<-- 0x00002001
在Little-Endian中,对于bit序列中的序号编排和Big-Endian刚好相反,其方式如下(以双字节数0x8B8A为例):
bit | 15 14 13 12 11 10 9 8 | 7 6 5 4 3 2 1 0 ------MSB-----------------------------------LSB val | 1 0 0 0 1 0 1 1 | 1 0 0 0 1 0 1 0 | +---------------------------------------------+ =0x 8 B 8 A
假设有一个int类型的变量0x12345678,其地址是0xbfa42030,如果是小端存储,那么高字节在高位,低字节在低位,也就是说,0xbfa42030所对应的字节为0x78,0xbfa42031所对应的字节为0x56,0xbfa42030所对应的字节为0x34,0xbfa42030所对应的字节为0x12。同时,每个bit位的顺序也是低bit在低位,高bit在高位。
判断机器是大端机还是小端机的代码:
#include<stdio.h>
int main(int argc, char * argv[])
{
int a=1;
char *p=(char *)&a;
if(1==*p)
printf("intel\n");
else
printf("moto\n");
return 0;
}