5

定义一个float变量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
4

3 回答 3

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

第一个将位视为浮点数。第二个将位视为一个整数。float 1.0 的位恰好是整数 1065353216 的位。

它基本上相当于:

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

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

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

于 2012-05-10T07:47:24.547 回答
9

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

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

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

于 2012-05-10T07:55:47.877 回答
2

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

请注意,这与转换为 an 不同int,后者了解如何从转换floatint。Casting toint &只是查看内存中的位,而不了解原始含义是什么。

于 2012-05-10T07:50:49.280 回答