C语言-联合


联合

所有成员共享一块空间

  • 联合的空间大小取决于联合体内部定义的最大变量类型,如下面代码中 int 有4个字节,最大,则UN 的空间大小为4个字节,
  • 向联合体内存数据,取的值都是一样的,因为共享一块空间,如下面 u.c 赋值为 10,u.a u.b 也赋值为10
#include

union UN {
	int a;
	char b;
	int c;

};

int main() {
	printf("%d", sizeof(union UN));    //4
	union UN u;
	u.c = 10;
	printf("%d %d %d", u.a, u.b, u.c);     //10 10 10
	return 0;
}

注意:虽然不同类型的变量共享一块地址,但是对其中变量赋值时只能总用于相同的类型。

大小端

1、出现原因

计算机系统中内存是以字节为单位进行编址的,每个地址单元都唯一的对应着1个字节(8 bit)。这可以应对char类型数据的存储要求,因为char类型长度刚好是1个字节,但是有些类型的长度是超过1个字节的(字符串虽然是多字节的,但它本质是由一个个char类型组成的类似数组的结构而已),比如C/C++中,short类型一般是2个字节,int类型一般4个字节等。因此这里就存在着一个如何安排多个字节数据中各字节存放顺序的问题。正是因为不同的安排顺序导致了大端存储模式和小端存储模式的存在。

2、存放方式
  • 小端存储:高地址放高位,低地址放低位(高高低低)
  • 大端存储:高地址放低位,低地址放高位(高低低高)

以下图为例存十进制100000,小端存储按高地址放高位,低地址放低位,大端存储按低地址放高位,高地址放低位

wev9qpuhwgnnjfxfga5lng

//用来判断环境是大端还是小端,以下用intel为例(intel)一般为小端存储
#include

int checkSystem(){
    union UN{
        int a;
        char c;
    }u;
    //将a赋值为1
    //如果环境是大端存储,1应在最右边字节的最后一位
    //若环境是小端存储,1应在最左边字节的最后一位
    u.a=1;
    //u.c的位置一直是最左边的字节。
    //若环境为大端存储,则u.c == 1 返回为0
    //若环境为小端存储,则u.c == 1 返回为1
    return u.c == 1;
}

int main(){
    printf("%d",checkSystem());
    //打印 1  说明该环境为小端存储
    return 0;
}