C-union关键字

C语言中union关键字

初めて遇到这个关键字(但是已经大三了啊喂!

union关键字可以规避C语言的类型系统,允许以多种类型来应用一个对象。用不同的字段来引用相同的内存块

初次见到union,你可能比较疑惑:怎么规避了C语言的类型系统呢?——看看后面。

事先知道对于一个数据结构中的两个不同字段的使用是互斥的,那么将这两个字段声明为联合的一部分(not 结构),会减小分配空间的总量

首先给个CSAPP上的栗子:

struct node{//一个非常经典的二叉树结构
  node* lchild;
  node* rchild;
  int data;
};
//----------------------------------------
union node{//使用union进行二叉树构建
    struct{
        union node *left;//左孩子节点
        union node *right;//右孩子节点
    }internal;
    double data[2];//叶子节点的数据
};

这个实现的二叉树的数据结构,二叉树的节点分为叶子节点(那种没有孩子节点的)和内部节点(那种有孩子节点的)。对于每个叶子节点都有两个double类型的数据值,而每个内部节点都有指向两个孩子节点的指针。

如果某节点是叶子节点,它显然没有孩子节点,那么node * leftnode *right比为空;如果某节点为内部节点,它是没有叶子节点的数据data[0]data[1]的。

\\ \\ \\ \\

考虑这么一个问题:当声明d=12.345时,将其强制转换为int或是unsigned int之类的,它会干啥呢?

**首先,你得先想起来,doublefloat类型,在计算机中是以IEEE754标准进行表示的。**所以d会被转换成一个普通的int

好的,问题来了:请问如何显示它IEEE754标准原有的二进制数据捏?

动用一下你聪明的大脑想想。

是不是可以考虑找到double d对应的内存地址,再把这块地址内部的数据按字节byte输出。就像这样:

double d = 56.1;
void *a = &(d);
cout << hex << *(int *)a << endl;

然后再上一个hin简单の栗子捏(助理解union干了什么,即它的作用):

union {
	float a;
	int b;
	double c;
} t;

int main() {
	t.a = 5.16;
	cout << t.b << endl;
	cout << t.c;
}

它的输出是:

1084563128
5.35845e-315

5.16这块存放的数据是40a51eb8,转化成十进制就是1084563128。double类型同理。

union相当于是里面包含了很多的字段,这些字段的类型可能不太一样,选择size最大的字段作为其大小,对union中某字段进行赋值后,使用另一个字段来显示(会把这块的内容按照自己的字段类型进行输出)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值