如何记忆以及地址变大的方向?使用工会

时间:2012-08-20 22:42:57

标签: c++ unions memory-address

我正在制作一个随机数字。我使用联合来访问字节。

typedef unsigned int uint;
typdef unsigned char uchar;
union
{
uint intBits;
uchar charBits[4];
};

//是的,我知道不能保证整数不是4而是忽略它。

因此,如果数字1存储在此联合中,它将看起来像

00000000 0000000 00000000 00000001 

正确?

-1的int看起来像

00000000 0000000 00000000 00000001 

10000000 0000000 00000000 00000001 

所以uint的地址真的是1对吗?而charBits [0]的地址是1对吗?令人困惑的是这个。 charBits [1],必须向左移动到这里

                        ! 
00000000 0000000 00000000 00000001

内存地址从右到左,从左到右也是如此?

编辑: 我使用的是64位Windows 7系统intel i7 CPU。

2 个答案:

答案 0 :(得分:1)

这取决于机器架构。如果你的CPU是大端,那么它会像你期望的那样工作:

int(4)=> b3 b2 b1 b0

但如果你的CPU是小端,则字节方向相反:

int(4)=> b0 b1 b2 b3

请注意,字节内的位顺序始终从左(最重要)到右(最不重要)。

答案 1 :(得分:1)

完全没有必要这样做。您可以轻松地从8位值组成32位整数,如下所示:

int myInt = byte1 | (byte2<<8) | (byte3<<16) | (byte4<<24);

您可以轻松地将32位整数分解为8位值,如下所示:

byte1 = myInt & 0xff;
byte2 = (myInt >> 8) & 0xff;
byte3 = (myInt >> 16) & 0xff;
byte4 = (myInt >> 24);

因此,没有理由编写依赖于CPU或平台的内部表示细节的非便携,难以理解的代码。只需编写清楚地完成您实际需要的代码。