C++中(int&)转换的含义是什么?

tob*_*oby 6 c++

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

cout << i << endl;
cout << j << end;
Run Code Online (Sandbox Code Playgroud)

随后的输出i1和的输出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++书籍.

  • 这是使用C++样式转换所获得的保护.如果编译器接受static_cast机会,那么你没有做错任何事情.静态强制转换允许你做的唯一不安全的事情是从Base*/Base&到Derived*/Derived&void*到T*的未经检查的转换,据我所知.它基本上可以反转隐式转换,而不是更多 - 不计算const转换. (3认同)

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++代码中使用它.