gpt4 book ai didi

将一种类型解释为另一种类型的正确方法?

转载 作者:行者123 更新时间:2023-12-04 05:54:38 25 4
gpt4 key购买 nike

假设我有一个 float我想解释为 unsigned int进行一些处理(让我们暂时假设 sizeof(float) == sizeof(int))。现在有多种“工作”方式,例如:

float f = 0.5f;
unsigned int u;

u = * (unsigned int*) (&var); /* works in most compilers */

union {
float f;
unsigned int u;
} uconv;

uconv.f = f;
u = uconv.u; /* works in most compilers */

现在我不知道标准,但是由于严格的别名规则,IIRC 第一个是未定义的行为,我听说后者也是未定义的行为。

那么,将一种类型的值解释为另一种类型的值的正确定义方法是什么?

请添加您的答案是否适用于 C89、C90、C99 甚至 C11。

最佳答案

一般来说,正确的方法是将变量的地址强制转换为 void* , char*unsigned char* ,因为任何其他指针转换都可能导致未定义的行为(实际上,因为 strict aliasing )。 int*float*是不兼容的指针类型。

sizeof两种类型是相同的,以下将起作用:

memcpy(&u, &var, sizeof(int));  // note: implicit conversion to void [const] *

您获得的值显然是实现定义的,因为它取决于 intfloat在内存中表示。

严格的混叠已经出现 since C89 .

编辑 : 之前关于 union 的问题似乎我错了黑客导致UB。 C11草案的相关部分指出:

If the member used to read the contents of a union object is not the same as the member last used to store a value in the object, the appropriate part of the object representation of the value is reinterpreted as an object representation in the new type as described in 6.2.6 (a process sometimes called ‘‘type punning’’).



-- 脚注 95 至 6.5.2.3 结构和 union 成员

关于将一种类型解释为另一种类型的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9655147/

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