C++ 内存是如何布局的?地址向哪个方向变大?使用工会

C++ 内存是如何布局的?地址向哪个方向变大?使用工会,c++,unions,memory-address,C++,Unions,Memory Address,我正在制作一个随机数生成器。我正在使用一个并集来访问字节 typedef unsigned int uint; typdef unsigned char uchar; union { uint intBits; uchar charBits[4]; }; //是的,我知道整数不能保证为4,但请忽略这一点 所以如果数字1存储在这个联合体中 00000000 0000000 00000000 00000001 00000000 0000000 00000000 00000001 对吧? 整

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

typedef unsigned int uint;
typdef unsigned char uchar;
union
{
uint intBits;
uchar charBits[4];
};
//是的,我知道整数不能保证为4,但请忽略这一点

所以如果数字1存储在这个联合体中

00000000 0000000 00000000 00000001 
00000000 0000000 00000000 00000001 
对吧?

整型是-1吗

00000000 0000000 00000000 00000001 
00000000 0000000 00000000 00000001 

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

                        ! 
00000000 0000000 00000000 00000001
那么内存地址是从右向左还是从左向右变大

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

这取决于机器体系结构。如果您的CPU是big-endian,那么它将按照您的预期工作:

int(4)=>B3B2 b1 b0

但如果您的CPU是little endian,则字节的方向相反:

int(4)=>b0b1b2b3


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

完全不需要这样做。您可以很容易地从8位值合成一个32位整数,如下所示:

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

所以,并没有理由编写依赖于CPU或平台的内部表示细节的不可移植、难以理解的代码。只需编写明确满足您实际需要的代码。

请注意,这取决于您打印代码时使用的惯例。如果不知道您的平台,您的问题几乎毫无意义。此外,许多平台使用2的补码表示数字,因此
-1
更可能是
11111111111111111111111
-1
必须是
11111111111111111111
。否则,如果将
1
添加到它,则不会得到
0
@戴维施瓦茨:不一定,有很多不同的表述。二的补语是最流行的,因为它使加法/减法非常容易。另一个选项是例如专用符号位,将
-1
表示为
10…01
。当然,这会使加法/减法变得更复杂(不过,它确实使更改数字的符号更容易,也可能使乘法更容易,但我必须查找它才能确定)。是的,其他的表示法实际上已经在计算机中使用过(虽然大多数不是特别的最新表示法)。所以在我的windows系统中,int值为10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000。所以它将是00000001 00000000。。。。0000@EddieV223不,它将是00000001,0,0,0符号位是否为-1000001 0000000 0000000 X000000,其中X是?符号位是最高有效位-1将设置所有位。(因为如果向其添加1,则需要得到0。唯一可以这样做的数字是所有位设置。)