7.3 Unions

联合体是一种使用指定成员数据类型,表示可以被访问的单个存储块的数据类型。一次只能使用联合体中的一种数据类型。默认情况下,联合体是非合并的,这意味着没有必要表示该联合体成员的存储方式。动态类型和chandle类型只能在标记的联合体中使用。
联合声明的语法见语法7-2。

13)当struct或union为合并时,也应使用合并关键字。
16)只有在带标签的联合体中声明一个void struct_union_member才是合法的。仅在未合并的结构中声明random_qualifier是合法的。
例子:

typedef union { int i; shortreal f; } num; // 命名联合数据类型
num n;
n.f = 0.0; // 将n设置为浮点数格式
typedef struct {
bit isfloat;
union { int i; shortreal f; } n; // 匿名联合体类型
} tagged_st;

如果在非合并联合体类型的变量声明中没有指定初始值,则该变量应初始化为该联合类型声明顺序中第一个成员类型的变量的默认初始值。
有一项特殊规定是为了简化非合并联合体的使用: 如果一个非合并联合体包含共享一个共同的初始序列的几个非合并结构体, 并且如果非合并联合体对象当前包含这些结构中的一个,它允许在可见联合体的完整类型的声明任何地方检查共同的初始部分,一个完整的类型的联盟宣言是可见的。如果一个或多个初始成员序列的对应成员具有相同的类型,则两个结构体共享一个共同的初始序列。

7.3.1 Packed unions

合并联合体应只包含整型数据类型的成员。合并的、无标签的联合体都应该是相同的大小(与非合并联合体或合并的、有标签的联合体相比,成员可以是不同的大小)。因此,被写入作为另一个成员的联合体成员可以被读回。合并联合体与非合并联合体的区别在于,当一个合并联合体作为一个主向量出现时,它将被视为一个单一向量。
合并联合体还可以作为一个整体与算术和逻辑操作符一起使用,它的行为由其有符号性决定,默认为unsigned。可以像选择范围为[n-1:0]的合并数组一样选择合并联合体的一个或多个位。
只有表6-8(见6.11)中总结的合并数据类型和整数数据类型在合并联合体中是合法的。
如果一个合并结构体包含一个2态成员和一个4态成员,则整个联合体是4态成员。在读取时,有一个从4态到2态的隐式转换,在写入2态成员时,有一个从2态到4态的隐式转换。
例如,一个联合体可以被不同的访问宽度访问:

typedef union packed { // default unsigned
s_atmcell acell;
bit [423:0] bit_slice;
bit [52:0][7:0] byte_slice;
} u_atmcell;
u_atmcell u1;
byte b; bit [3:0] nib;
b = u1.bit_slice[415:408]; // same as b = u1.byte_slice[51];
nib = u1.bit_slice [423:420]; // same as nib = u1.acell.GFC;

对于合并联合体,写一个成员和读另一个成员是独立于机器的字节顺序的,这与非合并结构体不同,非合并结构体兼容c语言,成员按升序地址顺序排列。

7.3.2 Tagged unions

在联合体中标记的限定符将其声明为标记的联合体,这是一个类型检查联合体。 普通(untagged)联合体可以使用一个成员类型的值进行更新,然后读取为另一个成员类型的值,这是一个潜在的类型漏洞。标记的联合体存储成员值和标记,即表示当前成员名的附加位。标签和值只能使用静态类型检查标记的联合体表达式一致地一起更新(见11.9)。成员值只能用与当前标记值(即成员名)一致的类型读取。因此,存储一种类型的值并(错误地)将其解释为另一种类型是不可能的。
动态类型和chandle类型不应用于无标签的联合体,但可以用于有标签的联合体。
带标记的联合体的成员可以作为带标记的表达式引用。见11.9。
除了类型安全之外,使用成员名作为标记也使代码比那些必须使用显式标记跟踪联合体的代码更简单、更小。标记的联合体也可以用于模式匹配(见12.6),这进一步提高了可读性。
在带标签的联合体中,当所有信息都在标签本身中时,成员可以用void类型声明,就像下面的例子,一个整数和一个有效位:

typedef union tagged {
void Invalid;
int Valid;
} VInt;

VInt类型的值要么是Invalid(不包含任何内容),要么是Valid(包含一个int类型)。第11.9节描述了如何构造这种类型的值,还描述了如何不可能从当前具有Invalid标记的VInt值中读取整数。
例如:

typedef union tagged {
struct {
bit [4:0] reg1, reg2, regd;
} Add;
union tagged {
bit [9:0] JmpU;
struct {
bit [1:0] cc;
bit [9:0] addr;
} JmpC;
} Jmp;
} Instr;

Instr类型的值要么是Add指令(在这种情况下它包含三个5位寄存器字段),要么是Jmp指令。在后一种情况下,它要么是无条件跳转(在这种情况下它包含一个10位的目的地址),要么是条件跳转(在这种情况下它包含一个2位的条件码寄存器字段和一个10位的目的地址)。第11.9节描述了如何构造Instr类型的值,以及如何,为了读取cc字段,例如,指令必须具有操作码Jmp和子操作码JmpC。
当在带标签的联合体上使用合并限定符时,所有成员都应该具有合并类型,但它们的大小不必相同。合并标签的联合体的(标准)表示如下:
— 其大小总是等于表示标签所需的位数加上成员的最大size。
— 标签的大小是为所有成员名编码所需的最小位数(例如,5到8个成员需要3个标签位)。
— 标签位总是左对齐的(即朝向msb)。
— 对于每个成员,成员位总是右对齐的[即,朝向最低有效位(lbs)]。
— 标签位和成员位之间的位是未定义的。在void成员的极端情况下,只有标签是有意义的,其余的位都是未定义的。
表示方案递归地应用于任何嵌套标记的联合体。
例如,如果VInt类型定义有合并的限定符,Invalid和Valid值将分别具有如图7-1所示的布局。

例如,如果Instr类型有合并的限定符,它的值将有如图7-2所示的布局。

【IEEE_SV-7.3】联合体的使用方法相关推荐

  1. C语言 | 联合体详解

    1024G 嵌入式资源大放送!包括但不限于C/C++.单片机.Linux等.关注微信公众号[嵌入式大杂烩],回复1024,即可免费获取! 一.什么是联合体? 在C语言中,变量的定义是分配存储空间的过程 ...

  2. 超详细C语言联合体union详解

    文章目录 前言 一.联合(共用体)定义 二.联合的特点及运用 三.联合的大小计算 总结 前言 上一期C语言快速入门我们学习了枚举类型及相关知识点,这期我们来跟着笔者学习一下联合体相关知识,相信聪明的你 ...

  3. 【重温经典C语言】~c语言中%x、%c、%d、%x等等等、c语言取地址符的作用、C语言中的 联合体

    本章目录: 1. c语言中%x.%c.%d.%x等等等 2. c语言取地址符&的作用 3. 了解 C语言中的 联合体 3.1 什么是联合体? 3.2 定义 3.2.1 举例 3.3 初始化联合 ...

  4. C语言联合体/共用体/union,枚举使用大全

    文章目录 一.前言 二.联合体 1.联合体基础 2. 联合体的使用方法和使用场景 2.1 多种访问内存途径共存 2.2 联合体union和大小端(big-endian.little-endian) 2 ...

  5. C语言联合体union详解

    一.联合(共用体)定义 联合是一种特殊的自定义类型,该种类型定义的变量也包含一系列的成员,特征是这些成员共用同一块空间,所以联合体也被称为共用体. 代码如下(示例): #include<stdi ...

  6. 菌群左右下的免疫力天平——免疫失衡疾病背后的新机制

    刚刚,来自美国耶鲁大学的免疫学专家Martin Kriegel及其同事在自然评论<Nature Reviews>上在线发表了综合评论文章:Host–microbiota interacti ...

  7. 在 Oracle Enterprise Linux 和 iSCSI 上构建您自己的 Oracle RAC 11g 集群

    作者:Jeffrey Hunter 了解如何以低于 2,700 美元的费用在 Oracle Enterprise Linux 上安装并配置 Oracle RAC 11g 第 2 版开发集群. 本指南中 ...

  8. Java面试题大全2021版

    一.Java 基础 JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境. JRE:Java Run ...

  9. java c语言union转换_C语言联合体(union)的使用方法及其本质-union

    转载自:https://blog.csdn.net/sizhouqun_84342712/article/details/53187106 1.联合体union的基本特性--和struct的同与不同 ...

最新文章

  1. Scala花括号和圆括号的区别
  2. js实现图片上传预览及进度条
  3. root用户连接mysql数据库出错 1045 access denied for user 'root'@'localhost' using password yes
  4. ROS中阶笔记(三):机器人仿真—ArbotiX+rviz功能仿真
  5. JVM初学之JVM的运行时数据区
  6. 【Elasticsearch】搜索自己想要的东西与注释文本(字符串)插件
  7. python 获取pv_Python爬虫入门教程 40-100 博客园Python相关40W博客抓取 scrapy
  8. 最新,最详细的LINUX图文配置教程|之DNS篇(1)
  9. CI 里去掉index.php 并 识别css js 文件 技巧
  10. Elasticsearch 之(33)document数据建模实战_文件搜索_嵌套关系_父子/祖孙关系数据...
  11. 解决虎牙、斗鱼网页端P2P上传&增强虎牙、斗鱼网页端功能!
  12. **matlab subs函数**
  13. Perl中use strict
  14. workbench应力应变曲线_ansys workbench中的7种应力结果如何理解
  15. 7大原因告诉你,为什么IT行业发展前景好
  16. 云媒易:保健品行业怎么做软文推广?
  17. Golang的大端序和小端序
  18. Linux apr的安装
  19. 安装SQL2000,提示安装程序配置服务器失败。
  20. vue 登录界面无法跳转问题

热门文章

  1. Verilog 每日一题 (VL27 可置位计数器)
  2. 不赚钱的副业才是刚需!
  3. Mac OS X 10.8.2终端切换root用户
  4. wordpress html5音乐播放器,15个可集成到WordPress的免费HTML5音频播放器
  5. linux源码安装iftop,【Linux 命令】iftop安装与简单使用
  6. 编码(ACSII unicod UTF-8)、QT输出中文乱码深入分析
  7. 私域视频号的运营小技巧
  8. 亚马逊云cpu异常占用100%
  9. processon_概念模型图绘制_以ER图为例
  10. 二叉查找树的编程与实现 C语言