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行做一些改变时,真的发生了什么?
答案 0 :(得分:3)
在第一个中,你做得很好。编译器能够将float b
转换为int i
,失去精度,但没关系。现在,在执行第二个示例时,请查看我的调试器窗口:
对不起我的俄语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
表示。 float
值1.0f
的符号位为零,指数为零(由8位值127表示,或二进制为01111111),尾数为1(由23-表示)位值为零),因此32位模式看起来像:
00111111 10000000 00000000 00000000
当重新解释为整数时,这将给出十六进制值0x3f800000
,即十进制的1065353216。
答案 4 :(得分:0)
首先将b
投射到int
,然后再将其分配给i
。这是“正确”的方式,因为编译器将正确转换值。
第二个不进行转换,并将b
的位重新解释为整数。如果你在floating point format上阅读,你可以确切地看到为什么你得到了你所获得的价值。
在幕后,所有变量都只是位的集合。如何解释这些位会改变它们所代表的感知价值。在第一个中,您将重新排列位模式以保留“感知”值(1)。在第二个中,您没有重新排列位模式,因此感知值未正确转换。