C语言共用体

这个是我一直不太理解的一种结构,然后现在想起来把我的想法记录下来,如果有错误,希望大家能够指正.

共用体的定义格式:

union 共用体名{
    成员列表
};

定义和结构体类似,结构体的关键字是struct,共用体的关键字是union.结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员.

共用体和结构体的区别(Union和typedef区别)_嵌入式小刘的博客-CSDN博客https://blog.csdn.net/qq_40305944/article/details/116270391那这个知道了,其实也没什么讲的了,但是我还是想把当初的思路讲出来.

最开始是看到下面的这个程序.

#include<stdio.h>
int main(){
	union{
		char ch[2];
		int d;
	}s;
	s.d=0x1234;
	printf("%d\n",sizeof(s));//4
	printf("%x,%x\n",s.ch[0],s.ch[1]);//34,12
	return 0;
}

首先这个程序,s变量拥有两个成员变量,一个是字符数组,一个是整型变量,我们知道int是4个字节,char是1个字节,所以s是占四个字节,然后对d变量进行了赋值,d和ch是共用一块区域,对应的s也就有值,所以ch数组里面的值不是随机数.低字节存放在低地址.所以ch[0]里面是低位,ch[1]里面是高位.0x1234就是十六进制的数1234,用十六进制的好处就是刚好两位就是一个字节,存在字符数组里面用%x输出十六进制,也就意味着就是把一个字节的数按照十六进制的整数输出,所以这里和ascii是没有关系,就是把存储的数据输出.毕竟字符和整型在计算机中都是以补码的形成存储的.字符是按ascii转换成整型存储.

#include<stdio.h>
int main(){
	union{
		char ch[4];
		int d;
	}s;
	s.d=0x12344578;
    //78,45,34,12
	printf("%x,%x,%x,%x\n",s.ch[0],s.ch[1],s.ch[2],s.ch[3]);
	//120,69,52,18
	printf("%d,%d,%d,%d\n",s.ch[0],s.ch[1],s.ch[2],s.ch[3]);
	//x,E,4,.
	printf("%c,%c,%c,%c\n",s.ch[0],s.ch[1],s.ch[2],s.ch[3]);
	return 0;
}

那么看下一个程序.

#include<iostream>
using namespace std;
union{
	int i;
	double d;
}x;
union{
	int i;
	double d;
}y;
int main(){
	x.i=3;x.d=4.5;
	y.i=4;y.d=8.3;
	//0,4.5,-1717986918,8.3
	cout<<x.i<<","<<x.d<<","<<y.i<<","<<y.d<<endl;
	return 0;
}

看到输出就感觉很奇怪,咋x.i等于0,y.i等于随机数了?所以他真的是随机数吗?

在前面我们已经知道了他们是共用一块区域的,所以是修改x.d的值导致,x.i的值发生了更改,也就是他是值发生了修改,不是没有值,那他为什么他的输出怎么奇怪呢,就有和浮点数在计算机中的存储有关了,整数和字符我们都知道了,那么浮点数在计算机中是如何存储的呢.

浮点数在计算机中的存储方式详解_浮点型常量在计算机中以什么形式储存_小C博客的博客-CSDN博客https://blog.csdn.net/lws123253/article/details/80266824所以我们知道了浮点数的存储模式不是按照补码的形式,这也就知道了为什么long占8个字节,但是他的取值范围没有4个字节的float的大.

这个当时我看着union的定义感觉他的值不是随机数,但是又不知道怎么和人说.

那就到此结束了,这次虽然我也知道文章有点水,但是还是希望能够帮助到大家,因为这个我当初学习的时候不是太能够理解.

猜你喜欢

转载自blog.csdn.net/weixin_64066303/article/details/130607056