我在C中有以下程序:
main() {
int arr[5]={100,200,300};
int *ptr1=arr;
char *ptr2=(char *)arr;
printf("%d\n",sizeof(int));
printf("%d %d",*(ptr1+2),*(ptr2+4));
return 0;
}
其输出如下:
4
300 -56
请解释最后的输出。根据我的理解,最后的输出应该是44而不是-56。
答案 0 :(得分:4)
您正在挑选arr[1]
的第一个八位字节。你的机器是带有4字节int
的小端,因此构成arr[1]
的4个八位字节被写为十进制:
200, 0, 0, 0
所以你将八位字节200解释为char
。您的char
已签名,您的计算机使用two's complement。
200的二进制表示是
11001000
由于设置了最高有效位,因此当作为有符号值查看时,这是负数。因此,为了计算出负值的大小,我们将这些位反转,然后加一个。
00110111
是十进制的55。因此,输出值为-56。
答案 1 :(得分:2)
事实上,如果你有sizeof(int) = 2
,你预期44会是什么,因为那时*(ptr2 +4)会指向300 = 256 + 44,其十六进制表示为1002E
和a 2E
的最后一个字节或十进制的44。
要独立于int的大小,你应该写:
printf("%d %d",*(ptr1+2),*(ptr2+(2 + sizeof(int)));
但它仍将依赖于字节序,并在大端计算机上给出0 ...