另一个基本的c语言有关问题

另一个基本的c语言问题
unsigned char *p1;
  unsigned long *p2;
  p1=(unsigned char *)0x801000;
  p2=(unsigned long *)0x810000;

  请问p1+5= ;
    p2+5= ;

这个问题之前有,但我在xp系统上打印出来的结果是p1+5=4101;p2+5=20;
转成16进制也不对,为什么呢?

------解决方案--------------------
C/C++ code
int main() 
{ 
        unsigned char *p1 = (unsigned char *)(0x801000);
        unsigned long *p2 = (unsigned long *)(0x810000);
        cout<<hex<<(long)p1<<ends<<hex<<(long)p2<<endl;
        p1 += 5; 
        p2 += 5; 
        cout<<hex<<(long)p1<<ends<<hex<<(long)p2<<endl;
        return 0;
}

------解决方案--------------------
C/C++ code

unsigned char *p1;
        unsigned long *p2;
        p1=(unsigned char *)0x801000; 
        p2=(unsigned long *)0x810000; 
        cout<<"0X"<<hex<<(void*)(p1+5)<<endl;
        cout<<"0X"<<hex<<(void*)(p2+5)<<endl;

------解决方案--------------------
哦~ 是问地址呀~~

C/C++ code
#include <stdio.h>

int main(void)
{
unsigned char *p1; 
unsigned long *p2; 
p1=(unsigned char *)0x801000; 
p2=(unsigned long *)0x810000; 

p1=p1+5;
p2=p2+5;

printf("%x,%x",p1,p2);

getchar();
return 0;
}

------解决方案--------------------
就是一个指针加法中1代表什么的问题
1代表的是一个单位量
p1+5=p1+5*1=p1+5*sizeof(unsigned char)=p1+5*1=0x801000+ox5=0x801005
p2+5=p2+5*1=p2+5*sizeof(unsigned long)=p1+5*4=0x810000+20=0x810000+0x14=0x810014
------解决方案--------------------
LZ也许没输0x
p2=(unsigned long *)810000; 
这样把p2+5用%d输出的话,的确是810020

如果真如题目,用%x输出应该是p1 = 0x801005, p2 = 0x810014
------解决方案--------------------
探讨
我用的就是TC,xp下

------解决方案--------------------
我明白了...你用的是TC,%x只输出16位长度.
------解决方案--------------------
探讨
引用:
我明白了...你用的是TC,%x只输出16位长度.

TC有这样的特性?

------解决方案--------------------
探讨
如果不是32位的,是16位系统,那么在做long之类的类型的时候不会有问题吗?