为什么该程序输出8589934593而不是4294967298?

问题描述 投票:1回答:3

这是滥用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 astruct的空间。

但是我的问题是,由于现在{1,2}组成a,因此二进制存储器对齐方式应为00000000000000000000000000000001 00000000000000000000000000000010,它应以十进制格式给出4294967298。但是,实际打印输出是8589934593,即00000000000000000000000000000010 00000000000000000000000000000001。似乎12的位置实际上已交换。

为什么会这样?

c++ memory memory-management
3个回答
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

因此,您的实验仅表明您正在小端字节序的计算机上运行代码。这就是全部。


0
投票

我以更可移植的方式重写您的代码,它需要c ++ 11:


0
投票

有趣的事实。在数字上,答案可以简化为2 ^ n + 1:n = 33的指数。哪一个2 ^(33)+1 = 8589934593并以二进制形式表示为1000000000000000000000000000000001。有32个零,在这种情况下为n-1。

© www.soinside.com 2019 - 2024. All rights reserved.