int a[]={0,2,3,4,5};问a - &a[4]的值?解决方案

int a[]={0,2,3,4,5};问a - &a[4]的值?
int   a[]={0,2,3,4,5};问a   -   &a[4]的值?

因为一个int是占四个字节,所以上面两个指针相减后的值应该是-16;
但我用int   value   =   a-&a[4]后,value的值却是-4;我看了反汇编代码如下(VS2005):
        29:   int   a[]   =   {0,2,3,4,5};
004123BE     mov                   dword   ptr   [a],0  
004123C5     mov                   dword   ptr   [ebp-14h],2  
004123CC     mov                   dword   ptr   [ebp-10h],3  
004123D3     mov                   dword   ptr   [ebp-0Ch],4  
004123DA     mov                   dword   ptr   [ebp-8],5  
        30:  
        31:   int   value   =   a   -   &a[4];
004123E1     lea                   eax,[ebp-8]  
004123E4     lea                   ecx,[a]  
004123E7     sub                   ecx,eax   //这个时候相减,ecx里保存的值应该是-16
004123E9     sar                   ecx,2       //但这句话把ecx的值右移两位,除了4,why?
004123EC     mov                   dword   ptr   [value],ecx  

从上面的汇编代码可以看到,在两个指针值相减后,把相减的值除了4,为什么这么做呢?请知情人士指点一下,谢谢.

------解决方案--------------------
-4嘛
指针相减,得到的结果并不是地址相减。二是这两个地址之间有多少个元素。

------解决方案--------------------
如果换成是指针变量a,那么(a+1)是指向了下一个元素,而不是移动了一个字节,换成你上面的例子道理也是一样的。
------解决方案--------------------
楼主,
一个数组的内存是连续的,
然后a代表首地址,
&a[4]代表第五个元素的地址,
a-&a[4]这是a和a[4]之间的元素个数,
这是因为a的类型是int*,
所以每次相减都是按int这四个字节来减的,
也就是说,
这并不是你要的指针地址之间的相减,
因为对数组来说,
a是个常指针,
它的地址也就是数组的首地址,
想做出指针相减,
可以
int *p=a;
int *q=p+4;
cout < <p-q < <endl; //这个和a-&a[4]一样,是-4
cout < <*p-*q < <endl; //这是元素的相减,0-5=-5
cout < <&p-&q < <endl; //这才是指针地址的相减,将是一个十六进制数