了解联合的内存内容

时间:2010-03-04 04:32:55

标签: 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;
}

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

我正在尝试理解该程序产生的输出1102813594

5 个答案:

答案 0 :(得分:11)

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

例如,在我的MSVC 2008中:

0x00415748  9a 99 bb 41

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

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

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

答案 1 :(得分:5)

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

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

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

答案 2 :(得分:4)

使用union,两个变量都从相同的内存位置开始存储。浮点数以IEEE格式存储(不记得标准数字,你可以查看[编辑:正如其他人所指出的,IEEE 754])。但是,它将是一个二进制补码归一化(尾数始终在0到10之间,指数可以是任何东西)浮点数。

你正在获取该数字的前4个字节(同样,你可以查找浮点数占用的16位或32位中的哪些位,不记得了)。所以它基本上没有任何意义,它作为一个int没用。也就是说,除非你知道为什么要这样做,但通常情况下,float和int组合并不是很有用。

而且,不,我不认为它是实现定义的。我相信标准规定了浮点数的格式。

答案 3 :(得分:3)

在工会中,成员将共享相同的记忆。这样我们就可以将浮点值作为整数值。

浮点数格式与整数存储不同。这样我们就可以使用union理解差异。

对于Ex:        如果我将12整数值存储在(32位)中。我们可以将这个12值作为浮点格式。

它将以有符号(1位),指数(8位)和高精度(23位)存储。

答案 4 :(得分:1)

我写了一个小程序,它显示了将32位浮点的位模式保存为32位整数时会发生什么。它为您提供了与您遇到的完全相同的输出:

#include <iostream>

int main()
{
    float f = 23.45;
    int x = *reinterpret_cast<int*>(&f);

    std::cout << x; // 1102813594
}