我遇到了这段代码,他们试图将其从float转换为int

int val[5];
union {
    int i;
    float f;
} conv;

...
val is updated with some value
...
case OUT_FORMAT_FLOAT:
for (i = 0; i < count; i++) {
   conv.f = val[i];
   val[i] = conv.i;
}

但是我只是无法理解它是如何工作的。将val[i]分配给conv.f,然后使用conv.i将值存储回val[i]中。 conv是 union 类型,因为我们使用的是f,所以i将没有有效值吧?

我在这里想念什么吗?

最佳答案

它正在执行名为type punning的操作。

这里要记住的一点是,浮点值通常以与整数不同的格式存储(最常见的是IEEE floating point format),并且并集的用途是获取原始浮点格式。

更具体地说,会发生以下情况:

  • 分配conv.f = val[i]。这会将val[i]中的整数转换为浮点值,并将其存储在conv.f中。
  • 分配val[i] = conv.i。这将获取存储在 union 中的原始浮点位模式,并将其分配给val[i]

  • 之所以可行,是因为 union 并不像具有单独成员的结构。在一个联盟中,所有成员共享相同的内存。修改 union 的一名成员将修改所有成员。

    关于使用 union 的原因的注释:也可以通过其他方式进行此转换,但这会破坏the strict aliasing rule,但是允许将 union 用于类型修剪。

    关于c - 此代码执行哪种转换?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33560457/

    10-11 21:13