1.大小端
小端存储:数据低字节保存在低地址中,高字节保存在高地址中。 大端存储:数据低字节保存在高地址中,高字节保存在低地址中。
2.判断方法
这里给出一种常见的方法,代码如下:
#include <stdio.h>
void test1(void)
{
union T
{
int a;
char b;
}t;
t.a = 1;
if (t.b == 1)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
}
int main(void)
{
test1();
}
3.判断方法详解
为什么这种方法可以判断大小端呢? 首先,C语言中,联合体有固定存放顺序,一定是从低地址开始存放数据(①),知道了这一点,再结合字节对齐的知识,我们就可以判断出,联合体t在内存中应该是下图左边这样的(a和b实际共用一段内存,这里分开画是为了看得更清楚):
①处的结论,我们可以用下面的程序来验证:
#include <stdio.h>
void test2(void)
{
union T
{
int a;
char b;
}t;
void* p;
t.a = 1;
p = &t;
printf("&t = %p\n", p);
p = &t.b;
printf("&t.b = %p\n", p);
}
int main(void)
{
test2();
}
运行程序,可以看到&t 和&t.b 是一样的. 接着,判断大小端,我们可以在test2() 的基础上,修改一下程序,得到:
void test3(void)
{
union T
{
int a;
char b;
}t;
char* p;
t.a = 1;
p = (char*)&t.a;
printf("%d\n", *p);
printf("&t.a = %p\n", p);
p = (char*)&t.a + 1;
printf("%d\n", *p);
p = (char*)&t.a + 2;
printf("%d\n", *p);
p = (char*)&t.a + 3;
printf("%d\n", *p);
p = (char*)&t.a - 1;
printf("%d\n", *p);
p = (char*)&t.a - 2;
printf("%d\n", *p);
p = (char*)&t.a - 3;
printf("%d\n", *p);
p = (char*)&t.a - 4;
printf("%d\n", *p);
p = (char*)&t.b;
printf("%d\n", *p);
printf("&t.b = %p\n", p);
}
运行程序,得到:
1
&t.a = 0024F62C
0
0
0
-52
64
49
64
1
&t.b = 0024F62C
所以可以得到结构体t 的数据存储情况: 由此可见,t.a 的低位1 放在了低地址里,所以应该是小端存储。
|