在以下程序的输出中混淆

时间:2012-11-16 06:35:14

标签: c++

float b = 1.0f;
int i = b;
int& j = (int&)i;
cout<<j<<endl;

o / p = 1

但对于以下情况

float b = 1.0f;
int i = b;
int& j = (int&)b;
cout<<j<<endl;

O / P = 1065353216

因为它们具有相同的值,所以它将显示相同的结果......任何人都可以让我知道当我在第3行做一些改变时,真的发生了什么?

5 个答案:

答案 0 :(得分:3)

在第一个中,你做得很好。编译器能够将float b转换为int i,失去精度,但没关系。现在,在执行第二个示例时,请查看我的调试器窗口:

enter image description here

对不起我的俄语IDE界面,第一列是变量名,第二列是值,第三列是类型。

如您所见,现在浮点数被简单地解释为int。因此,前导1位被解释为整数的位,这将导致您获得的结果。所以基本上,你采用float的二进制表示(通常它表示为符号位,尾数和指数),并尝试将其解释为int

答案 1 :(得分:2)

在第一种情况下,您正确初始化j并且演员阵容是多余的。在第二种情况下,你做错了(即对不同类型的对象)但是强制转换会关闭编译器。

在第二种情况下,你得到的可能是1.0的内部表示,解释为整数。

答案 2 :(得分:1)

引用不进行任何内存分配,它只是在本地名称及其地址的表中放置一个条目。在第一种情况下,名称'j'指向先前分配给int数据类型的内存(对于变量'i'),而在第二种情况下,名称'j'指向分配给float数据类型的内存(对于变量'b')。当你使用'j'时,编译器会在适当的地址解释数据,就像它是int一样,但实际上有一些浮点放在那里,这就是为什么你得到一些“奇怪的”数而不是1

答案 3 :(得分:1)

整数1和浮点1.0f在数学上可能是相同的值,但在C ++中,它们具有不同的类型,具有不同的表示。

左值转换为引用等同于reinterpret_cast;它说“查看此内存位置中的任何内容,并将这些字节解释为int”。

在第一种情况下,内存包含int,因此将这些字节解释为int会给出预期值。

在第二种情况下,内存包含float,因此您可以看到代表浮动的字节(或者可能只是其中的一些,或者也许是一些额外的,如果sizeof(int) != sizeof(float))点数,重新解释为整数。

您的计算机可能使用32位int和32位IEEE float表示。 float1.0f的符号位为零,指数为零(由8位值127表示,或二进制为01111111),尾数为1(由23-表示)位值为零),因此32位模式看起来像:

00111111 10000000 00000000 00000000

当重新解释为整数时,这将给出十六进制值0x3f800000,即十进制的1065353216。

答案 4 :(得分:0)

首先将b投射到int,然后再将其分配给i。这是“正确”的方式,因为编译器将正确转换值。

第二个不进行转换,并将b的位重新解释为整数。如果你在floating point format上阅读,你可以确切地看到为什么你得到了你所获得的价值。

在幕后,所有变量都只是位的集合。如何解释这些位会改变它们所代表的感知价值。在第一个中,您将重新排列位模式以保留“感知”值(1)。在第二个中,您没有重新排列位模式,因此感知值未正确转换。