关键词不能为空

联合(Union):数据成员存储在共享内存区域中的关键功能

作者:admin
来源:http://www.sdzsb8.cn/baike/44227.html
日期:2022-10-08 07:30
评论:0
阅读 59

在前一篇文章中,我们讨论了联合(Union)的原始应用,联合(Union)数据结构一直在为互斥变量创建共享内存区域。但是,随着时间的推移,程序员已广泛使用联合(Union)用于完全不同的应用程序:从较大的数据对象中提取较小的数据部分。在本文中,我们将更详细地介绍联合(Union)的这个特定应用。

使用联合(Union)包装/拆包数据

联合(Union)的数据成员存储在共享内存区域中。这是允许我们为联合(Union)找到有趣的程序应用的关键功能。

考虑下面的联合(Union):

每天学习一点:用于打包和解包数据的C语言中的联合(Union)

此联合(Union)中有两个成员:第一个成员“word”是一个双字节变量。第二个成员是两个单字节变量的结构。为联合(Union)分配的两个字节在其两个成员之间共享。

分配的内存空间可以如下面的图1所示:

每天学习一点:用于打包和解包数据的C语言中的联合(Union)

图1

虽然“word”变量指的是整个分配的存储空间,但“byte1”和“byte2”变量指的是构成“word”变量的单字节区域。我们如何使用此功能?假设您有两个单字节变量“x”和“y”,它们应该组合起来产生一个双字节变量。

在这种情况下,您可以使用上面的联合(Union)并将“x”和“y”分配给结构成员,如下所示:

每天学习一点:用于打包和解包数据的C语言中的联合(Union)

现在,我们可以读取union的“word”成员来获得由“x”和“y”变量组成的双字节变量(参见图2)。

每天学习一点:用于打包和解包数据的C语言中的联合(Union)

图2

上面的例子显示了使用联合(Union)将两个单字节变量打包成一个双字节变量。我们也可以反过来:将一个双字节值写入“word”并通过读取“x”和“y”变量将其解压缩为两个单字节变量。将值写入联合(Union)的一个成员并读取其中的另一个成员有时被称为“数据压缩(data punning)”。

处理器的字节顺序

使用联合(Union)打包/解包数据时,我们需要注意处理器的字节顺序。正如Robert Keim关于字节序的文章中所讨论的,该术语指定了数据对象的字节存储在内存中的顺序。处理器可以是小端或大端。对于大端处理器,数据的存储方式使包含最高有效位的字节具有最低的存储器地址。在小端系统中,首先存储包含最低有效位的字节。

图3中描述的示例说明了序列0x01020304的小端和大端存储。

每天学习一点:用于打包和解包数据的C语言中的联合(Union)

图3

图3.图片由IAR提供。

让我们使用以下代码来试验上一节的联合(Union):

每天学习一点:用于打包和解包数据的C语言中的联合(Union)

运行此代码,我得到以下输出:

字节是:0X4321

这表明共享存储空间的第一个字节(“u1.byte1”)用于存储“word”变量的最低有效字节(0X21)。换句话说,我用来执行代码的处理器是小端。

如您所见,这个联合(Union)的特定应用程序可以表现出依赖于实现的行为。但是,这不应该是一个严重的问题,因为对于这种低级编码,我们通常知道处理器的字节顺序。如果我们不知道这些细节,我们可以使用上面的代码来了解数据在内存中的组织方式。

替代方案

我们也可以使用按位运算符来执行数据的打包或解包,而不是使用联合(Union)。例如,我们可以使用以下代码组合两个单字节变量“byte3”和“byte4”,并生成一个双字节变量(“word2”):

每天学习一点:用于打包和解包数据的C语言中的联合(Union)

让我们比较这两个解决方案在小端和大端情况下的输出。请考虑以下代码:

每天学习一点:用于打包和解包数据的C语言中的联合(Union)

如果我们为大端处理器(如TMS470MF03107)编译此代码,则输出将为:

Word1是:0X2143

Word2是:0X2143

但是,如果我们为一个小端序处理器(如STM32F407IE)编译它,输出将是:

Word1是:0X4321

Word2是:0X2143

虽然基于联合(Union)的方法表现出依赖于硬件的行为,但是基于移位操作的方法导致相同的结果,而不管处理器的字节顺序如何。这是因为,采用后一种方法,我们为变量名称(“word2”)赋值,编译器负责设备使用的内存组织。但是,使用基于联合(Union)的方法,我们正在更改构造“word1”变量的字节值。

尽管基于联合(Union)的方法表现出依赖于硬件的行为,但它具有更易读和可维护的优点。这就是为什么许多程序员喜欢在这个应用程序中使用联合(Union)的原因。

“数据压缩(Data Punning)”的实例

使用常见的串行通信协议时,我们可能需要执行数据打包或解包。考虑在每个通信序列期间发送/接收一个字节数据的串行通信协议。只要我们使用一个字节长的变量,就可以很容易地传输数据,但是如果我们有一个应该通过通信链接的任意大小的数据结构呢?在这种情况下,我们必须以某种方式将我们的数据对象表示为一个单字节长变量的数组。一旦我们得到这个字节数组表示,我们就可以通过通信链路传输字节。然后,在接收器端,我们可以适当地打包它们并重建原始结构。

例如,假设我们需要通过UART通信发送一个浮点变量“f1”。 float变量通常占用四个字节。因此,我们可以使用以下联合(Union)作为缓冲区来提取“f1”的四个字节:

每天学习一点:用于打包和解包数据的C语言中的联合(Union)

变送器将变量“f1”写入联合(Union)的浮动成员。然后,它读取“byte”数组并沿通信链路发送字节。接收器执行相反的操作:它将接收到的数据写入其自己的联合(Union)的“byte(字节)”数组,并将联合(Union)的float变量作为接收值读取。我们可以使用这种技术来传输任意大小的数据对象。以下代码可以是验证此技术的简单测试。

每天学习一点:用于打包和解包数据的C语言中的联合(Union)

下面的图4显示了所讨论的技术。请注意,字节按顺序传输:

每天学习一点:用于打包和解包数据的C语言中的联合(Union)

图4

结论

虽然联合(Union)的原始应用正在为互斥变量创建共享内存区域,但随着时间的推移,程序员已经广泛使用了联合(Union)用于完全不同的应用程序中:使用联合(Union)进行数据打包/解包。联合(Union)的这种特殊应用涉及将值写入联合(Union)的一个成员并读取其中的另一个成员。

“数据压缩(data punning)”或使用联合(Union)进行数据打包/解包可能导致依赖于硬件的行为。但是,它具有更易读和可维护的优点。这就是为什么许多程序员喜欢在应用程序中使用联合(Union)的原因。当我们有一个应该通过串行通信链路的任意大小的数据对象时,“数据压缩(data punning)”会特别有用。


本文来自网络,不代表「专升本要什么条件_专升本要几年_成人高考专升本_山东专升本信息网」立场,转载请注明出处:http://www.sdzsb8.cn/baike/44227.html

联合(Union):数据成员存储在共享内存区域中的关键功能的相关文章

  • 2020下半年天津四级人力资源管理师报考指南(报考指南2020)

    2020下半年天津四级人力资源管理师报考指南(报考指南2020):1、一、四级人力资源管理师考试报名形式和时间市鉴定中心接受具备申报资格的申报机构进行集中的鉴定申报。2、符合申报条件的个人可直接向市鉴定中心申报企业人力资源管理师的鉴

    热讯
  • 会计从业资格证主要考什么题型?(会计资格证考试题)

    会计从业资格证主要考什么题型?(会计资格证考试题):1、从网站首页上找到报名系统登录口,在进行登前录一般都要求考生先注册。2、在注册的过程中要认真填写考生的个人信息,部分重要信息一经提交后不能更改(如:身份证号码、姓名

    热讯
  • 宁夏教育考试网站登录密码忘了怎么办(宁夏教育考试网登录)

    宁夏教育考试网站登录密码忘了怎么办(宁夏教育考试网登录):1、宁夏教育考试网站登录密码不记得也不要紧,可以通过以下3种方式重置密码:1、自助重置密码。2、考生可通过回答注册时的“密码保护问题”自行重置密码。3、2、短信获取密码。

    问答
  • 表白的话真实点的(表白的话真实点的)

    表白的话真实点的(表白的话真实点的):1、1、我嘴拙,不会许太多承诺,只会想你更多,未来是漫长得路;你是不可或缺得幸福;珍惜和你在一齐得每一分,每一刻,以后得日子,我们一起过好吗?2、我就是喜欢你,怎样了。

    问答
  • 上海最好的中专是哪几个?(上海中专学校排名)

    上海最好的中专是哪几个?(上海中专学校排名):1、以下是上海市好的中专学校,排名不分先后:1.上海信息技术学校2.上海石化工业学校*3.上海交通大学医学院附属卫生学校4.上海市商业学校5.民航上海中等专业学校*6.上海港湾学校7

    热讯
  • 在哪可以查到建造师的在建情况?(全国建造师网官网)

    在哪可以查到建造师的在建情况?(全国建造师网官网):1、可以在中国建造师网查询。2、第一步、打开浏览器,在百度中输入“建造师”,然后下方会出现中国建造师网的官方网站,然后点击官方网站进入即可,如下图所示;第二步、点击进

    热讯
  • 什么是监督执纪的四种形态(监督执纪四种形态)

    什么是监督执纪的四种形态(监督执纪四种形态):1、监督执纪的四种形态是指:1、党内关系要正常化,批评和自我批评要经常开展,让咬耳扯袖、红脸出汗成为常态;2、党纪轻处分和组织处理要成为大多数;3、对严重违纪的重处分、

    问答
  • 四川大学网络教育(四川大学网络教育文凭有用吗)

    四川大学网络教育(四川大学网络教育文凭有用吗):大家好,今天来为大家关于四川大学网络教育(四川大学网络教育文凭有用吗)很多人还不知道,现在让我们一起来看看吧 1.四川大学网络教育对学员学习作业认真负责。2.网络大学的学生

    问答
  • 内蒙古科技大学怎么样「张雪峰评内蒙古科技大学」

    内蒙古科技大学怎么样「张雪峰评内蒙古科技大学」:内蒙古科技大学张雪峰内蒙古科技大学张雪峰教授内蒙古科技大学 张雪峰教授民航二所两项科研成果通过鉴定张雪峰(攀枝花学院材料物理与化学专业教授)改革开放四十...时代在发展独

    招生学校
网站公告