了解联合的内存内容

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

#include  int main() { union u { int i; float f; }; union u tst; tst.f = 23.45; printf("%d\n", tst.i); return 0; } 

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

我想了解这个程序产生的输出1102813594

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

例如,在我的MSVC 2008中:

 0x00415748 9a 99 bb 41 

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

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

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

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

如果将int打印为hex值,则更容易理解。

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

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

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

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

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

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

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

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

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

 #include  int main() { float f = 23.45; int x = *reinterpret_cast(&f); std::cout << x; // 1102813594 }