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

时间:2012-05-10 07:42:56

标签: 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

3 个答案:

答案 0 :(得分:14)

cout << (float &)a <<endl;
cout << (int &)a << endl;

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

它基本上相当于:

float a = 1.0;
int* b = (int*) &a;
cout << a << endl;
cout << *b << endl;

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

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

答案 1 :(得分:9)

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

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

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

答案 2 :(得分:2)

值不同,因为将float解释为int &(对int的引用)会使门敞开。 a不是int,所以当你这样做时,几乎任何事情都可能发生。碰巧看float就像int一样1065353216会给你42,但根据底层的机器架构,它可能是int或粉红色的芭蕾舞短裙甚至崩溃。

请注意,这与投射到float不同,int了解如何从int &转换为{{1}}。转换为{{1}}只是查看记忆中的位而不理解原始含义是什么。