【发布时间】:2022-01-04 15:25:20
【问题描述】:
#include <iostream>
#include <bitset>
using namespace std;
int main()
{
//from float to bits
float f;
cin >> f;
int x = *(int*)&f;
cout << x << "\n";
bitset<sizeof(int) * 8> binary(x);
cout << binary;
}
*(int*)& 做了什么让bitset 工作?
我可以理解&f 使它成为地址和x= sizeof 地址f? (也许)但它在bitset<sizeof(int)> 中是如何工作的,* 8 有什么作用?
【问题讨论】:
-
请注意
int x = *(int*)&f;是 a strict aliasing violation 和未定义的行为。 -
出于好奇,您在哪里找到了该代码?
-
这实际上是一个古老的 C hack。
float和int可能具有相同的大小(可能但不是必须)。*(int*)&f是一个“重新解释”的演员。它将float f的存储重新解释为int。使用int,可以应用位算术来评估/隔离位。尽管如此 - 这是一个旧的 C hack,在 C++ 中不再有效。 (我什至不确定现代 C 中是否仍然允许这样做。) -
sizeof(int) * 8将int的大小乘以 8 得到位数。 (sizeof返回字节数。) -
C++ 等价物使用
std::memcpy将位从float复制到int。