gpt4 book ai didi

c - 联盟不重新诠释值(value)观?

转载 作者:太空狗 更新时间:2023-10-29 16:59:54 28 4
gpt4 key购买 nike

考虑这个程序:

#include <stdio.h>

union myUnion
{
int x;
long double y;
};

int main()
{
union myUnion a;
a.x = 5;
a.y = 3.2;
printf("%d\n%.2Lf", a.x, a.y);
return 0;
}

输出:

-858993459
3.20

这很好,因为 int 成员使用 long double 成员的某些位进行解释。然而,反过来并不适用:

#include <stdio.h>

union myUnion
{
int x;
long double y;
};

int main()
{
union myUnion a;
a.y = 3.2;
a.x = 5;
printf("%d\n%.2Lf", a.x, a.y);
return 0;
}

输出:

5
3.20

问题是为什么 long double 没有被重新解释为一些垃圾值(因为它的 4 个字节应该代表整数)?这不是巧合,程序为 a.x 的所有值输出 3.20,而不仅仅是 5。

最佳答案

However, the reverse doesn't really apply

在小端系统上(多字节值的最低有效字节在最低地址),int 将对应于 long 的尾数的最低有效位双。您必须非常精确地打印 long double 才能看到 int 对那些无关紧要的数字的影响。

在大端系统上,比如 Power PC 机,情况会有所不同:int 部分将与 long double 的最重要部分对齐,与符号位、指数和最高有效尾数位重叠。因此 x 的变化会对观察到的浮点值产生巨大影响,即使只打印了几个有效数字。但是,对于较小的 x 值,该值似乎为零。

在 PPC64 系统上,程序的以下版本:

int main(void)
{
union myUnion a;
a.y = 3.2;
int i;
for (i = 0; i < 1000; i++) {
a.x = i;
printf("%d -- %.2Lf\n", a.x, a.y);
}
return 0;
}

什么都不打印

1 -- 0.0
2 -- 0.0
[...]
999 - 0.0

这是因为我们正在创建一个全为零的指数字段,从而产生接近于零的值。然而,初始值 3.2 完全被破坏了;它不仅会扰乱最低有效位。

关于c - 联盟不重新诠释值(value)观?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58033111/

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