求解啊 代码 很短解决办法

求解啊 代码 很短
#include <stdio.h>
int main()
{
    int a[3]={0,1,2};
    int *p,*q;
    p = a;
    q = &a[2];
    printf("a= %d\n",a);//a=-18
     printf("a0= %d\n",&a[0]);//a0=-18
    printf("p= %d\n",p);//p= -18
    printf("a2= %d\n",&a[2]);//a2 = -14
    printf("q= %d\n",q);//q = -14
     printf("a[q-p]= %d",a[q-p]);//2
     printf("q-p=%p\n",q-p);//0002
    system("pause");
    return 0;
}

为什么啊? 难道  -14-(-18)== 2 求解。
------解决方案--------------------
指向同一数组的两个指针相减,是两个指针存储值相减再除以所指向的类型大小
------解决方案--------------------
1.地址相减 == 地址偏移/每个元素所占空间(即代表偏移的元素个数)
2.你这个地方出现负数是因为:地址是无符号整数,所以这个地方%d输出产生了负数(实则为正).