对于*(mmu_tbl_base)+virtuladdr>>20等的一点理解

来源:互联网 发布:知乎 感谢领导知遇之恩 编辑:程序博客网 时间:2024/06/05 11:54

如下:

unsigned long *mmu_tlb_base = (unsigned long *)0x30000000; 
如果执行mmu_tlb_base=mmu_tlb_base+1,会得到mmu_tlb_base为0x30000004的结果,对于指针的加减操作会将+1自动转换为+指针类型字节数 
(unsigned short *)mmu_tlb_base+1的结果是0x30000002 
(unsigned long)mmu_tlb_base+1的结果是0x30000001 

long指针是4字节对齐,所以+1实际上地址等于+4 
short指针是2字节对齐,所以+1实际上地址等于+2 
long指针是1字节对齐,所以+1实际上地址等于+1 

int不同编译器针对不同硬件平台会得出不同结果,有可能是32位(4字节),也有可能是16位(2字节) 


---------------------------------- 

将一个立即数的值传给指针前必须加(long *)这样的强制转换是C语言为了防止误操作采取的一种保护措施,不同指针有不同的对齐要求,虽然立即数可以表示出地址的具体数值,但存在一个问题:有可能给一个不满足对齐要求的值给long这样有对齐要求的指针,这样会出错,如果语法上要求必须强制转换,可以提醒程序员在该位置留意转换的对齐问题

原创粉丝点击