gpt4 book ai didi

c - 联盟 : strange behavior [c]

转载 作者:太空宇宙 更新时间:2023-11-04 02:08:27 25 4
gpt4 key购买 nike

据说:“union 是一种特殊的类类型,一次只能保存一个它的非静态数据成员。”(http://en.cppreference.com/w/cpp/language/union )

但它怎么能容纳不止一个成员呢?

y 为 8 个字节,x 为 4 个字节。 union 的大小是 MAX 元素的大小(8 字节)。它不能容纳 4 + 8 = 12 个字节...

我很困惑。

#include <stdio.h>
#include <stdlib.h>

union number {
int x;
double y;
};

int main()
{
union number value;

// ok
value.x = 1;
printf("\n int: %5d\ndouble: %f\n", value.x, value.y);

// ok
value.y = 1.0;
printf("\n int: %5d\ndouble: %f\n", value.x, value.y);

// NOT OK! But if I swap `value.x and value.y` it will work properly...
value.y = 1.0;
value.x = 1;
printf("\n int: %5d\ndouble: %f\n", value.x, value.y);


return 0;
}

输出是OUTPUT

最佳答案

union 为“最大”数据类型分配了足够的内存。

例如,如果 union 将包含 uint8_t a、uint16_t b。数据将对齐如下

Bits LSB   0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15   MSB
Uint8_t a -------------->
Uint16_t b ------------------------------------>
Var b= 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 in binary

如果你看一下 var a。它会给你二进制 00000001,十进制 128。`好吧,我不知道我现在是不是更让你困惑了:)。

关于c - 联盟 : strange behavior [c],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17883304/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com