float b = 1.0f;
int i = (int)b;
int& j = (int&)b;
cout << i << endl;
cout << j << end;
Run Code Online (Sandbox Code Playgroud)
随后的输出i是1和的输出1065353216!这对我来说是个大惊喜!那么(int&)转换的真正含义是什么?
sel*_*tze 18
这是C风格演员的问题.你必须仔细观察,看看你得到了什么.在你的情况下,"(int)"是一个普通的静态强制转换.该值通过截断转换为int.在你的情况下,"(int&)"是一个重新解释演员.结果是一个左值,它引用了b的内存位置,但被视为一个int.这实际上违反了严格的别名规则.因此,如果在启用所有优化后您的代码不再起作用,请不要惊讶.
使用C++样式转换的等效代码:
float b = 1.0f;
int i = static_cast<int>(b);
int& j = reinterpret_cast<int&>(b);
cout<<i<<endl;
cout<<j<<end;
Run Code Online (Sandbox Code Playgroud)
在这些类型的演员表上查看你最喜欢的C++书籍.
Joh*_*ica 11
在十六进制1065353216中是0x3F800000.如果将其解释为32位浮点数,则得到1.0.如果你用二进制写出来,你得到这个:
3 F 8 0 0 0 0 0 0011 1111 1000 0000 0000 0000 0000 0000
或者分组不同:
0 01111111 00000000000000000000000 s eeeeeeee vvvvvvvvvvvvvvvvvvvvvvv
第一位(s)是符号位,接下来的8位(e)是指数,最后23位(v)是有效位."单精度二进制浮点指数使用偏移二进制表示进行编码,零偏移为127;在IEEE 754标准中也称为指数偏差." 解释这个你看到符号是0(正),指数是0(01111111 b = 127,"零偏移"),有效数是0.这给你+0 0,即1.0.
无论如何,正在发生的是你正在引用float(b)并将其重新解释为int引用(int&).所以,当你读取你的值时,j你会得到这些位b.解释为浮点数,这些位表示1.0,但解释为int这些位表示1065353216.
对于它的价值,我从未使用&类似的演员(int&).我不希望看到这个或在任何普通的C++代码中使用它.