gpt4 book ai didi

C union 位域转换

转载 作者:行者123 更新时间:2023-11-30 17:03:44 25 4
gpt4 key购买 nike

我不明白转换位字段时会发生什么。

假设我们有这个 union 和一个示例:

union {
unsigned char data;
int d : 3;
unsigned char m : 3;
}x;

int main() {
x.data = 182;
// 182 (binary) -> 1 0 1 1 0 1 1 0
printf("sizeof(x) = %lu\n", sizeof(x));
printf("x.data = %d\n", x.data);
printf("x.d = %d\n", x.d);
printf("x.m = %d\n", x.m);
printf("(unsigned char)x.d = %d\n", (unsigned char)x.d);
printf("(signed char)x.d = %d\n", (signed char)x.d);
printf("(signed char)x.m = %d\n", (signed char)x.m);
printf("(unsigned char)x.m = %d\n", (unsigned char)x.m);
return 0;
}

这是输出:

/*
sizeof(x) = 4
x.data = 182
x.d = -2
x.m = 6
(unsigned char)x.d = 254 //?
(signed char)x.d = -2 //?
(signed char)x.m = 6 //?
(unsigned char)x.m = 6 //?
*/

现在,我理解了 x.datax.dx.m 输出,但我不理解的是我们得到的结果转换时。

转换时内存中会发生什么?为什么我们会得到这些结果:

  • (无符号字符)x.d = 254
  • (signed char)x.d = -2
  • (签名字符)x.m = 6
  • (无符号字符)x.m = 6

编辑:我不明白的是这是如何在内存中处理的,以及在转换时读取哪些部分。我将 182 放入 x.data 中,二进制为 10110110。x.data、x.m 和 x.d 为我提供了预期结果,但为什么 (unsigned char)x.d 返回 254?为什么它不返回 182,因为 x.data 和 x.d 位于同一内存位置,并且我将 x.d 转换为与 x.data 类型相同的无符号字符。

最佳答案

x.dx.m 显示转换没有发生任何变化,这是预期的。 x.d 在两种情况下都具有相同的位模式,但当它被视为有符号时被解释为 -2,当这些相同的位被解释为无符号时被解释为 254。

如果您在 union 内读写一个变量,这些变量被分组在一个 union 中,这一事实将节省空间,但当您写入一个变量并读取另一个变量时,这是未定义的行为。

关于C union 位域转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36036495/

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