大端、小端问题
1.大小端概念:
大端:将数据的地位,放到内存的高地址处;
小端:将数据的地位,放到内存的地地址处;
在计算机中,内存是存储容量以字节为基本单位的;
数据是用 二进制为基本单位的
2.数据在内存中的地址
我们拿一个整形举例,一个整形,在32位平台下占4个字节,但是取地址时,我们通常认为数值最小的那个地址是这个整形的地址。
3.如何验证
//方法一;
int check_sys()
{
int i = 1;
return (*(char*)&i);
}
int main()
{
int ret = check_sys();
if (ret == 1)
printf("小端\n");
else
printf("大端\n");
return 0;
}
int i=1 //以32 位为例, 整形在内存中占4个字节,以补码形式储存
0x1 0x2 0x3 0x4 ——>计算机中内存的增长 (模拟)
0000 0001 0000 0000 0000 0000 0000 0000 ——>小端
0000 0000 0000 0000 0000 0000 0000 0001 ——>大端
char类型占1个字节
如果是小端,在(char*)强转时截取低地址处1个字节,解引用返回是1;
反之是 0,则说明是大端;
//方法二
int check_sys()
{
union X
{
int i;
char j;
}x;
x.i=1;
return x.j;
}
int main()
{
int ret = check_sys();
if (ret == 1)
printf("小端\n");
else
printf("大端\n");
return 0;
}
方法二在原理上与方法一样,在实现形式上有所不同;
联合体里面的成员变量共用一块空间;
返回 x.j时,截取低地址处;