Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 数组输出指针_C_Arrays_Pointers - Fatal编程技术网

C 数组输出指针

C 数组输出指针,c,arrays,pointers,C,Arrays,Pointers,我有以下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。您正在挑选arr[

我有以下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。

您正在挑选
arr[1]
的第一个八位组。您的机器是具有4字节
int
的little endian,因此构成
arr[1]
的4个八位字节被写成十进制:

200, 0, 0, 0
因此,您将八位字节200解释为
char
。您的
char
已签名,并且您的计算机使用

200的二进制表示是

11001000
由于设置了最高有效位,因此当作为有符号值查看时,这是一个负数。所以,为了计算出负值的大小,我们将位反转,然后加一

00110111

十进制是55。因此,输出的值是-56。

事实上,如果您有
sizeof(int)=2
,您希望得到44,因为此时*(ptr2+4)将指向300=256+44,十六进制表示为
1002E
,最后一个字节为
2E
,或者十进制表示为44

要获得独立于int上的大小的值,应编写:

printf("%d   %d",*(ptr1+2),*(ptr2+(2 + sizeof(int)));

但它仍然取决于endianness,在大端计算机上给出0…

为什么你认为它应该是
44
?它取决于
endianness
好的,我在编译器中运行过,int是2字节。在这种情况下,它的输出为44。这还取决于一个整数需要多少字节。是的,对于两个字节的整数,该代码挑选出
300
的第一个八位字节,它被存储为
44,1
。也可以说,由于值是环绕的,char显然被解释为在-128-127范围内(通过这个特定的编译器),200被解释为负值200-256=-56。