这是滥用void*
ptr的示例(这本身是一种不良的编码实践),但是当我查看内存详细信息时,它会变得很有趣。
#include <iostream>
using namespace std;
typedef struct {
long a;
void print() {
std::cout << a;
}
} st;
int main() {
int t[2] = {1,2};
void* p = t;
st* spt = (st*) p;
spt->print();
return 0;
}
由于
long
是64位,而int
是32位,因此t中的两个整数{1,2}
构成了long a
中struct
的空间。但是我的问题是,由于现在
{1,2}
组成了a
,因此二进制内存对齐方式应该是00000000000000000000000000000001 00000000000000000000000000000010
,它应该以十进制格式给出4294967298
。但是,实际的打印输出是8589934593
,即00000000000000000000000000000010 00000000000000000000000000000001
。看来1
和2
的位置实际上已交换。为什么会这样呢?
最佳答案
在小端机上,您的{ 1, 2 }
数组按以下字节序列排列在内存中
01 00 00 00 02 00 00 00 // addresses increase from left to right
当重新解释为64位little-endian值时,它将生成
8589934593
。在big-endian机器上,将相同的数组布置为
00 00 00 01 00 00 00 02 // addresses increase from left to right
当重新解释为64位big-endian值时,它将生成
4294967298
。因此,您的实验仅表明您在低端字节序的计算机上运行代码。这里的所有都是它的。
关于c++ - 为什么此程序输出8589934593而不是4294967298?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33578360/