C++ 什么';C+中(int&;)转换的含义是什么+; float b=1.0f; int i=(int)b; int&j=(int&)b; cout

C++ 什么';C+中(int&;)转换的含义是什么+; float b=1.0f; int i=(int)b; int&j=(int&)b; cout,c++,C++,这是C型演员的问题。你必须仔细看看你得到了什么。在你的例子中,“int”是一个正常的静态类型。该值通过截断转换为整数。在你的例子中,“int&”)是一个重新解释的演员阵容。结果是一个左值,它引用了b的内存位置,但被视为int。它实际上违反了严格的别名规则。因此,如果您的代码在启用所有优化后不再工作,请不要感到惊讶 具有C++风格的等效代码: float b = 1.0f; int i = (int)b; int& j = (int&)b; cout << i <

这是C型演员的问题。你必须仔细看看你得到了什么。在你的例子中,“int”是一个正常的静态类型。该值通过截断转换为整数。在你的例子中,“int&”)是一个重新解释的演员阵容。结果是一个左值,它引用了b的内存位置,但被视为int。它实际上违反了严格的别名规则。因此,如果您的代码在启用所有优化后不再工作,请不要感到惊讶

具有C++风格的等效代码:

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

cout << i << endl;
cout << j << end;
float b=1.0f;
int i=静态(b);
int&j=重新解释铸件(b);

cout似乎您正试图通过使用(int&)cast创建对浮点的int引用。这将不起作用,因为浮点数的表示方式与int不同。这将不起作用

如果float和int的表示形式相同,那么它可能会起作用

float b = 1.0f;
int i = static_cast<int>(b);
int& j = reinterpret_cast<int&>(b);
cout<<i<<endl;
cout<<j<<end;

在第二次转换中,您看到的是包含b的内存空间,就好像它是包含int的内存空间一样。浮点值以与整数完全不同的方式存储,因此结果确实不同…

在十六进制中,1065353216是0x3F800000。如果将其解释为32位浮点数,则得到1.0。如果你用二进制写出来,你会得到:

float b = 1.0f;
...
int& j = (int&)b;
3f8000 0011 1111 1000 0000 0000 0000 0000 0000 或以不同方式分组:

3 F 8 0 0 0 0 0 0011 1111 1000 0000 0000 0000 0000 0000 0 01111111 00000000000000000000000 s EEEEEEE VVVVVVVV 第一位(
s
)是符号位,接下来的8位(
e
)是指数,最后23位(
v
)是有效位。“单精度二进制浮点指数使用偏移量二进制表示法进行编码,零偏移量为127;在中也称为指数偏差。”对此进行解释时,您会看到符号为0(正),指数为0(011111b=127,“零偏移量”),有效位为0。这将为您提供+00,即1.0

无论如何,现在发生的事情是,您正在引用一个float(
b
),并将其重新解释为一个int引用
(int&)
。因此,当您读取
j
的值时,您可以从
b
获得位。这些位被解释为浮点,表示1.0,但被解释为整数,这些位表示10653216


值得一提的是,我从未使用过像
(int&)
这样使用
的cast。我不希望看到这个,或者在任何普通的C++代码中使用这个。

在这个特定的情况下,转换的问题没有意义。它试图重新解释
float
对象和
int
左值占用的内存。这在C/C++中显然是非法的,这意味着它会产生未定义的行为。未定义的行为-这是它在本例中的唯一含义。

你打算怎么做? 同样的事情:

0 01111111 00000000000000000000000 s eeeeeeee vvvvvvvvvvvvvvvvvvvvvvv
float b=1.0f;
int i=(int)b;
int*j=(int*)b//这里我们将b视为指向整数的指针

这里有一个输入错误,(v)重复了两次,将第一个(v)改为(e)。这正是节目中发生的事情。是的,这是一个很好的答案。但我还有一个问题。为什么在我使用static_cast将float转换为int&like“float b=1.0f;int&j=static_cast b;”时发生错误,“error:invalid static_cast from type'float'to type'int&'”。我没有发现StasyType在我的FavaEITC++ C++中的局限性,即C++编程语言。如果编译器接受静态类型转换,那么很可能您没有做错任何事情。就我记忆所及,静态强制转换允许您做的唯一不安全的事情是未经检查地从Base*/Base&转换为Derived*/Derived&并从void*转换为T*。它基本上可以反转隐式转换,而不是更多——不包括常量转换。
float b = 1.0f;
int i = (int) b;
int* j = (int*)b;//here we treat b as a pointer to an integer
cout<<i<<endl;
cout<<(*j)<<endl;
float b = 1.0f;
int i = (int) b;
int castedB = (int)b;//static_cast<int>(b);
int& j = castedB;
cout<<i<<endl;
cout<<j<<endl;