Rac*_*gon 3 c arrays pointers character-arrays
int i=512;
char *c = (char *)&i;
c[0] =1;
printf("%d",i);
Run Code Online (Sandbox Code Playgroud)
这显示"513",它为i加1.
int i=512;
char *c = (char *)&i;
c[1] =1;
printf("%d",i);
Run Code Online (Sandbox Code Playgroud)
而这显示256.除以2.有人可以解释为什么?非常感谢
Qua*_*key 12
以二进制表示的32位数字512只是:
00000000000000000000001000000000
Run Code Online (Sandbox Code Playgroud)
因为2的9的幂是512.传统上,你从右到左读取位.
以下是二进制中的一些其他十进制数:
0001 = 1
0010 = 2
0011 = 3
0100 = 4
Run Code Online (Sandbox Code Playgroud)
当你这样做:
int i = 512;
char *c = (char *)&i;
Run Code Online (Sandbox Code Playgroud)
您可能知道,您将4字节整数解释为字符数组(8位字节).如果没有,这是正在发生的事情:
&i
Run Code Online (Sandbox Code Playgroud)
获取变量的地址i.
(char *)&i
Run Code Online (Sandbox Code Playgroud)
将它重新解释(或强制转换)为指向char类型的指针.这意味着它现在可以像数组一样使用.由于您知道计算机int上至少有32位,因此可以使用它来访问其字节c[0], c[1], c[2], c[3].
根据系统的字节顺序,可以列出数字的字节:最重要的字节优先(大端),或最低有效字节优先(小端).x86处理器是小端.这基本上意味着数字512的布局如上例所示,即:
00000000 00000000 00000010 00000000
c[3] c[2] c[1] c[0]
Run Code Online (Sandbox Code Playgroud)
我将这些位分组为独立的8位块(字节),这些块对应于它们在内存中的布局方式.注意,你也从右到左阅读它们,所以我们可以保持二进制数系统的约定.
现在设置c[0] = 1有这样的效果:
00000000 00000000 00000010 00000001
c[3] c[2] c[1] c[0]
Run Code Online (Sandbox Code Playgroud)
这是2^9 + 2^0 == 513十进制的.
设置c[1] = 1有这样的效果:
00000000 00000000 00000001 00000000
c[3] c[2] c[1] c[0]
Run Code Online (Sandbox Code Playgroud)
这是2^8 == 256十进制的,因为你用00000001 覆盖了第二个字节00000010
请注意大端系统,字节将以相反的顺序存储到一个小端系统.这意味着如果你在其中一台机器上运行它,你会得到完全不同的结果.