EncodeFloat如何在Google Protobuf中运行?

时间:2013-06-03 15:44:25

标签: c++ protocol-buffers

所以他们有:

inline uint32 WireFormatLite::EncodeFloat(float value) {
  union {float f; uint32 i;};
  f = value;
  return i;
}

我不明白。我们还没有看到i的任何价值......那怎么样?这里发生了什么?

1 个答案:

答案 0 :(得分:1)

在联盟中,成员的存储重叠。如果两个成员具有相同的大小(即,如果你可以assert(sizeof(float) == sizeof(uint32))对齐,那么你真正在做的是:

  1. float存储到f
  2. 的位置
  3. uint32的位置读取i
  4. 你可以同样

    return *reinterpret_cast<uint32 *>(&value);
    

    (同样,只要您确定两种类型的大小相同,并且具有相同的对齐要求)。