整数由字节序列组成。但是不同系统中字节的顺序是不同的。例如,考虑数字 134480385(二进制 = 00001000000001000000001000000001)。在小端系统上,它是(左边的地址最低)
00000001 00000010 00000100 00001000
但是在大端系统上,字节以相反的方式存储。LEFT 仍然是最低地址。
00001000 00000100 00000010 00000001
当您将整数 a 的地址转换为 char(字节)指针时,它指向整数中的第一个字节(最低地址)。向指针写入 1 时,最低字节设置为 00000001。但是 char 只有 1 个字节长,因此其他字节不变。然后将第二个字节设置为 00000010。
在您的示例中,小端序中的 512 是
00000000 00000010
大端比较棘手,因为结果取决于 int 中有多少字节。它通常是 4,但也可能是 2 或更多。作为 2 字节 int,内存中的 512 是
00000010 00000000
作为一个 4 字节的 int 它是
00000000 00000000 00000010 00000000
(对于小端序并不重要,因为额外的字节只是零)
将 1 写入第一个字节并将 2 写入第二个字节后,您将进入内存以获取 4 字节的 little endian
00000001 00000010 00000000 00000000
一个 4 字节的大端序
00000001 00000010 00000010 00000000
请注意,第三个字节中的位仍然存在。这是因为我们只写入了前两个字节。第三和第四字节不变。
和一个 2 字节的大端
00000001 00000010
将 2 或 4 字节内存(2 字节忽略的额外零)解释为小端数作为正常二进制数
00000000000000000000001000000001 = 513
将 4 字节内存解释为大端数作为普通二进制数
00000001000000100000001000000000 = 16908800
将 2 字节内存解释为大端数作为普通二进制数
0000000100000010 = 258
我的计算可能有误,但希望你能明白。这就是为什么在不同类型的指针之间进行转换时需要小心的原因。