二进制
用二进制表示的32位数字512,就是:
00000000000000000000001000000000
因为 2 的 9 次方是 512。通常,您从右到左读取位。
这里有一些其他的二进制十进制数:
0001 = 1
0010 = 2
0011 = 3
0100 = 4
演员表:将 Int 重新解释为字节数组
当你这样做时:
int i = 512;
char *c = (char *)&i;
您可能知道,您将 4 字节整数解释为字符数组(8 位字节)。如果没有,这是发生了什么:
&i
获取变量i的地址。
(char *)&i
将其重新解释(或强制转换)为指向 char 类型的指针。这意味着它现在可以像数组一样使用。由于您知道 int 在您的机器上至少是 32 位的,因此可以使用 c[0], c[1], c[2], c[3] 访问其字节。
根据系统的endianness,可能会布置数字的字节:最高有效字节在前(大端),或最低有效字节在前(小端)。 x86 处理器是小端的。这基本上意味着数字 512 的布局如上例所示,即:
00000000 00000000 00000010 00000000
c[3] c[2] c[1] c[0]
我已经根据它们在内存中的布局方式将这些位分组为单独的 8 位块(字节)。请注意,您也可以在此处从右到左阅读它们,因此我们可以保持二进制数系统的约定。
后果
现在设置c[0] = 1有这个效果:
00000000 00000000 00000010 00000001
c[3] c[2] c[1] c[0]
十进制为2^9 + 2^0 == 513。
设置c[1] = 1有这个效果:
00000000 00000000 00000001 00000000
c[3] c[2] c[1] c[0]
这是十进制的2^8 == 256,因为您已经用 00000001 覆盖第二个字节 00000010
请注意在 big endian 系统上,bytes 将以与 little endian 系统相反的顺序存储。这意味着如果你在其中一台机器上运行它,你会得到完全不同的结果。