32位机器二级分页地址掩码疑问:两宏是否返回相同结果?
32位机器二级分页掩码宏的结果差异解答
嘿,这两个宏在32位机器上肯定不会返回相同结果,咱们拆开来慢慢分析:
先拆解两个宏的计算过程
1. PAGE_DIRECTORY_ADDRESS_MASK
这个宏做了两步核心操作:
- 把
0xfff强制转换为uint64_t(64位无符号整数),此时这个值的低12位全为1,剩下的高52位都是0; - 对这个64位数值取反,最终得到的是高52位全1、低12位全0的64位常量,对应的十六进制是
0xFFFFFFFFFFFFF000。
2. PAGE_TABLE_ADDRESS_MASK
这个宏的操作逻辑更贴合32位环境:
- 把
0xfff转换为uint32_t(32位无符号整数),此时值的低12位全1,高20位全0; - 取反后得到高20位全1、低12位全0的32位常量,十六进制是
0xFFFFF000。
结合32位分页场景的补充说明
你给出的32位地址位结构是「20位基址 + 12位偏移」,这意味着我们需要的是能保留高20位、清零低12位的32位掩码——也就是第二个宏的结果完全匹配需求。
虽然把第一个64位掩码截断到32位后,低32位的内容和第二个宏一致,但这两个宏本身的数据类型和完整数值范围完全不同:第一个是64位类型,第二个是32位类型。在32位编译环境下,使用第一个宏可能会触发类型不匹配的警告,甚至在某些场景下导致意外的行为。
内容的提问来源于stack exchange,提问作者hhwwww
相关产品推荐
相关产品推荐

