这是滥用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
。
在大端机上,相同的数组布局为
00 00 00 01 00 00 00 02 // addresses increase from left to right
当重新解释为64位big-endian值时,将产生
4294967298
。
因此,您的实验仅表明您正在小端字节序的计算机上运行代码。这就是全部。
我以更可移植的方式重写您的代码,它需要c ++ 11:
有趣的事实。在数字上,答案可以简化为2 ^ n + 1:n = 33的指数。哪一个2 ^(33)+1 = 8589934593并以二进制形式表示为1000000000000000000000000000000001。有32个零,在这种情况下为n-1。