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

What does this mean? (int &)a

本文关键字:int 是什么 意思      更新时间:2023-10-16

定义一个浮点变量a,将a转换为float & and 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
cout << (float &)a <<endl;
cout << (int &)a << endl;

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

它基本上相当于:

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

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

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

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

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

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

这些值是不同的,因为将float解释为int &(参考int(会使大门敞开。 a不是int,所以当你这样做时,几乎任何事情都可能发生。碰巧的是,将float视为int会让您1065353216,但根据底层机器架构,它可能是42或穿着粉红色芭蕾舞裙的大象,甚至崩溃。

请注意,这与转换为int不同,后者了解如何从float转换为int。投射到int &只是看内存中的位,而不明白原始含义是什么。