这是什么意思?(int &)a
What does this mean? (int &)a
定义一个浮点变量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 &
只是看内存中的位,而不明白原始含义是什么。
- "类模板示例<int>;"语句对 C++11 是什么意思?
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 是什么导致了这种使用三进制而不是短整型的有符号int到无符号int转换
- C++ 未初始化的本地(非全局)int 数组中的元素类型到底是什么?
- map<string, int> m= {}; 在C++中是什么意思?
- 行 - " vector<int> used(adj.size(), 0); "是什么意思?
- 使输出流式处理运算符适用于 boost::variant<std::vector<int>、int、double 的正确方法是什么>
- 代码中的"vector<<int>vector>&index"是什么意思?
- 在这种情况下,int**在C中是什么意思
- "1L << count"是什么意思?如何使用超出"unsigned long long int? "范围的语句编号打印?
- "int(i)=1;"是什么意思?
- freq_table[field_pm_value] = map<string, int>(); 是什么意思?
- 统一初始化是隐式发生的,即使 int 强制转换运算符是使用 explicit 关键字声明的.原因是什么?
- map<int,int>的*迭代器是什么?它不是pair<int,int>
- 在C#中等效于未签名的长Int是什么
- "cannot Convert vector<int>* to int"是什么意思?
- <T::* int>是什么意思?
- C++中的新Bytef[int]是什么
- *new int是什么意思?
- A<int(int)>是什么意思?这项技术叫什么名字?