我目前正在自学C++,并尽可能了解有关内存的所有知识。我发现你可以使用char指针将int的位模式复制并通过强制类型转换存储在内存中:
#include <iostream>
using namespace std;
int main()
{
int x = 20;
char* cp = new char[sizeof(int)];
cp[0] = *((char*)&x);
cp[1] = *((char*)&x+1);
cp[2] = *((char*)&x+2);
cp[3] = *((char*)&x+3);
std::cout << (int)*cp; // returns 20;
return 0;
}
上述代码有效,当我将cp转换为int时,编译器每次读取4个字节,我得到的正确数字是20。
但是如果将其更改为float:
#include <iostream>
using namespace std;
int main()
{
float x = 20;
char* cp = new char[sizeof(float)];
cp[0] = *((char*)&x);
cp[1] = *((char*)&x+1);
cp[2] = *((char*)&x+2);
cp[3] = *((char*)&x+3);
std::cout << (float)*cp; // returns 0.
return 0;
}
返回0。现在我有点困惑了。如果我复制每个字节,为什么它仍然给我一个0?如果有人能帮我理解这一点,那就太棒了。
(float)*cp
改为*(float*)cp
。我警告不要使用这种做法,因为它们绕过了 C++ 的强类型系统,只有在极少数情况下并且经过谨慎考虑才应该使用。 - Eljay(float)
将ASCII字符的值从整数转换为浮点数。其他字节不被访问。 - Eljaystd::memcpy
不会伤害任何人,编译器可以看穿它并尽可能避免实际复制。 - Quimby