关闭

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

1561人阅读 评论(0) 收藏 举报

如下:

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这样有对齐要求的指针,这样会出错,如果语法上要求必须强制转换,可以提醒程序员在该位置留意转换的对齐问题

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:100968次
    • 积分:1227
    • 等级:
    • 排名:千里之外
    • 原创:24篇
    • 转载:11篇
    • 译文:0篇
    • 评论:11条