1

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

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 系统英特尔 i7 CPU 上。

4

2 回答 2

1

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

int(4) => b3 b2 b1 b0

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

int(4) => b0 b1 b2 b3

请注意,字节内的位顺序总是从左(最高有效)到右(最低有效)。

于 2012-08-20T22:48:01.063 回答
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 或平台的内部表示细节的不可移植、难以理解的代码。只需编写清楚地执行您真正想要的代码即可。

于 2012-08-20T23:03:24.577 回答