这是什么意思?(int&)a

Fei*_*Xue 5 c++

定义一个浮点变量a,将a转换为float&和int&,这是什么意思?转换后,a是自己的参考?为什么这两个结果不同?

#include <iostream>
using namespace std;
int
main(void)
{
    float a = 1.0;
    cout << (float &)a <<endl;
    cout << (int &)a << endl;

    return 0;
}


thinkpad ~ # ./a.out 
1
1065353216
Run Code Online (Sandbox Code Playgroud)

Cor*_*bin 14

cout << (float &)a <<endl;
cout << (int &)a << endl;
Run Code Online (Sandbox Code Playgroud)

第一个处理像是浮点数的位.第二个处理比特,就像它是一个int.float 1.0的位恰好是整数1065353216的位.

它基本上相当于:

float a = 1.0;
int* b = (int*) &a;
cout << a << endl;
cout << *b << endl;
Run Code Online (Sandbox Code Playgroud)

(int &) a将a转换为对整数的引用.换句话说,对a的整数引用.(正如我所说的那样,将a的内容视为整数.)

编辑:我现在环顾四周,看看这是否有效.我怀疑它不是.这取决于类型是否小于或等于实际大小.

  • 那很有意思.我不知道转换为引用类型实际上相当于执行重新解释转换. (4认同)

Jam*_*nze 9

这意味着未定义的行为:-).

说真的,这是一种形式的双关语. a是一个float,但a也是一个内存块(通常是四个字节),其中包含位. (float&)a意味着把那块记忆当作一个float(换句话说,它实际上是什么); (int&)a意味着将其视为一种int.正式地,通过具有除对象a的实际类型之外的类型的左值表达式来访问对象(例如)是未定义的行为,除非该类型是字符类型.实际上,如果两种类型具有相同的大小,我希望结果是对位模式的重新解释.

在a的情况下float,位模式包含符号,指数和尾数的位. 通常,指数将使用一些超额n表示法,并且只有0.00作为指数.(某些表示,包括在PC上使用的表示,不会存储尾数的高位,因为在基数2中的标准化形式,它必须始终为1.在这种情况下,存储的尾数1.0将具有所有位0 .)通常(我不知道这里有任何例外),指数将存储在高位中.结果是当您将浮点值"打字"为相同大小的整数时,无论浮点值如何,该值都会相当大.