了解联合的内存内容

Moe*_*oeb 8 c c++ memory memory-management unions

假设我定义了一个这样的联合:

#include <stdio.h>

int main() {
    union u {
        int i;
        float f;
    };
    union u tst;
    tst.f = 23.45;

    printf("%d\n", tst.i);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

有人能告诉我tst存储的内存是什么样的吗?

我试图了解1102813594该程序产生的输出.

Eli*_*sky 11

这取决于实现(编译器,操作系统等),但如果需要,您可以使用调试器实际查看内存内容.

例如,在我的MSVC 2008中:

0x00415748  9a 99 bb 41
Run Code Online (Sandbox Code Playgroud)

是记忆内容.从左侧的LSB(Intel,little-endian机器)读取,这是0x41bb999a或实际上是1102813594.

但是,通常,整数和浮点数存储在相同的字节中.根据您访问联合的方式,您可以获得这些字节的整数或浮点解释.内存空间的大小同样取决于实现,尽管它通常是与某些固定边界对齐的最大成分.

为什么这样的价值在你的(或我的)情况下呢?你应该阅读有关它的浮点数表示(查找ieee 754)

  • @rogue:根据标准 - "联盟的规模足以容纳其中最大的成员" (4认同)

Joh*_*ler 5

结果取决于编译器实现,但对于大多数x86编译器,float和int的大小相同.维基百科有一个非常好的32位浮点布局图http://en.wikipedia.org/wiki/Single_precision_floating-point_format,这可以帮助解释1102813594.

如果将int打印为十六进制值,则更容易理解.

printf("%x\n", tst.i);
Run Code Online (Sandbox Code Playgroud)