首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >联合提取数据

联合提取数据
EN

Stack Overflow用户
提问于 2010-08-13 08:03:45
回答 3查看 320关注 0票数 4

this问题中的联合会不会导致UB在以下情况下使用:

代码语言:javascript
复制
union Data
{
    unsigned int intValue;
    unsigned char argbBytes[4];
};
Data data;
data.intValue = 1235347;
unsigned char alpha = data.argbBytes[0]; //UB?

我认为9.5/1在标准中是:

在一个联合中,最多一个数据成员可以在任何时候都是活动的,也就是说,最多一个数据成员的值可以在任何时候存储在一个联合中。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-08-13 08:19:45

一般来说,将一种类型的值写入一个联合,然后将其作为另一种类型读取是未定义的行为,这是正确的。另一方面,iirc标准显式地允许任何可以转换为char数组的内容。这从来没有100%清楚的优先,但所有的实现,我曾经使用允许联合铸造做你想做的任何事情。

票数 3
EN

Stack Overflow用户

发布于 2010-08-13 08:08:28

我认为这是不确定的,因为您所做的是特定于平台的工作。阿尔法将以不同的值结束,这取决于您的平台是大端还是小端。

但是,您所展示的技术很大程度上等同于执行reinterpret_cast。

我认为标准是指出,您不能在两个成员中存储不同的值(因为它们在内存中重叠)。

union发明的真正原因是为了让人们能够在更小的内存中容纳更多的数据。传统上,除了联合之外,您还会将一些标记(可能存储在位掩码中的一两个标记)保存在联合之外,以记住哪个联合成员是活动的。使用此标记时,必须仔细编写对联合的访问代码,以便只读取活动成员。

票数 3
EN

Stack Overflow用户

发布于 2010-08-13 08:21:03

从帖子中还不清楚平台上“int”的大小是多少。假设32位整数和8位字符,即(Int) == 4的大小.

它也不清楚什么是终端的机器。让我们假设小安迪安。

在这种情况下,0x12D993 (小数1235347)将存储为

0x93 0xd9 0x12 0x00 (增加地址)

当通过' argbBytes‘访问这个内存时,argbBytes的值实际上取决于机器的端点。因此,它不是一个未定义的行为,而是一个实现定义的行为。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3474990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档