此随笔测试x86下如何存储int型数据:高地址位存储int的高位,低地址位存储int的低位。这种存储方式叫做小端格式。
另外还有“大端格式”。
看一个程序:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![ExpandedBlockStart.gif](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
#include
"
stdio.h
"
void main()
{
int ival = 65536 ;
char * p = & ival;
printf( " *p: %d\n " , * p);
printf( " *p+1: %d\n " , * (p + 1 ));
printf( " *p+2: %d\n " , * (p + 2 ));
printf( " *p+3: %d\n " , * (p + 3 ));
printf( " *p+4: %d\n " , * (p + 4 ));
// 打印指针地址
printf( " p: %p\n " , p);
printf( " p+1: %p\n " , p + 1 );
printf( " p+2: %p\n " , p + 2 );
printf( " p+3: %p\n " , p + 3 );
printf( " p+4: %p\n " , p + 4 );
}
void main()
{
int ival = 65536 ;
char * p = & ival;
printf( " *p: %d\n " , * p);
printf( " *p+1: %d\n " , * (p + 1 ));
printf( " *p+2: %d\n " , * (p + 2 ));
printf( " *p+3: %d\n " , * (p + 3 ));
printf( " *p+4: %d\n " , * (p + 4 ));
// 打印指针地址
printf( " p: %p\n " , p);
printf( " p+1: %p\n " , p + 1 );
printf( " p+2: %p\n " , p + 2 );
printf( " p+3: %p\n " , p + 3 );
printf( " p+4: %p\n " , p + 4 );
}
输出结果:
*p: 0
*p+1: 0
*p+2: 1
*p+3: 0
*p+4: -52
p: 0012FF70
p+1: 0012FF71
p+2: 0012FF72
p+3: 0012FF73
p+4: 0012FF74
看一个练习题:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![ExpandedBlockStart.gif](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1
#include
"
stdio.h
"
2 void main()
3 {
4 union { char a[ 10 ];
5 int i;
6 } u;
7
8 int * p = ( int * ) & (u.a[ 1 ]); // 注意是a[1],不是a[0]
9 * p = 65536 ;
10 printf( " u.i = %d\n " , u.i);
11 printf( " u.a[0] = %d\n " , u.a[ 0 ]);
12 printf( " u.a[1] = %d\n " , u.a[ 1 ]);
13 printf( " u.a[2] = %d\n " , u.a[ 2 ]);
14 printf( " u.a[3] = %d\n " , u.a[ 3 ]);
15 printf( " u.a[4] = %d\n " , u.a[ 4 ]);
16 }
2 void main()
3 {
4 union { char a[ 10 ];
5 int i;
6 } u;
7
8 int * p = ( int * ) & (u.a[ 1 ]); // 注意是a[1],不是a[0]
9 * p = 65536 ;
10 printf( " u.i = %d\n " , u.i);
11 printf( " u.a[0] = %d\n " , u.a[ 0 ]);
12 printf( " u.a[1] = %d\n " , u.a[ 1 ]);
13 printf( " u.a[2] = %d\n " , u.a[ 2 ]);
14 printf( " u.a[3] = %d\n " , u.a[ 3 ]);
15 printf( " u.a[4] = %d\n " , u.a[ 4 ]);
16 }
输出结果:
u.i = 16777420
u.a[0] = -52
u.a[1] = 0
u.a[2] = 0
u.a[3] = 1
u.a[4] = 0
关于字节序的参考:http://hi.baidu.com/santy/blog/item/0cb6024fd0634730aec3ab09.html