假设我定义了一个这样的联合:
#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
。
答案 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
}