我正在制作一个随机数字。我使用联合来访问字节。
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。
答案 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或平台的内部表示细节的非便携,难以理解的代码。只需编写清楚地完成您实际需要的代码。