C 分层分页地址掩码
我遇到了以下c代码,它打算在32位机器上运行,并在2-hierarchical-paging中为页面目录地址和页面表地址生成位掩码:C 分层分页地址掩码,c,bit-manipulation,paging,bitmask,C,Bit Manipulation,Paging,Bitmask,我遇到了以下c代码,它打算在32位机器上运行,并在2-hierarchical-paging中为页面目录地址和页面表地址生成位掩码: #define PAGE_DIRECTORY_ADDRESS_MASK (~((uint64_t)0xfff)) #define PAGE_TABLE_ADDRESS_MASK (~((uint32_t)0xfff)) 两个函数不都返回相同的结果吗 20 bits 12 bits +--------------+--------+ | 1...
#define PAGE_DIRECTORY_ADDRESS_MASK (~((uint64_t)0xfff))
#define PAGE_TABLE_ADDRESS_MASK (~((uint32_t)0xfff))
两个函数不都返回相同的结果吗
20 bits 12 bits
+--------------+--------+
| 1...........1|0......0|
+--------------+--------+
32 12 11 0
好问题!它们可能看起来是一样的,但:
#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
#define PAGE_DIRECTORY_ADDRESS_MASK (~((uint64_t)0xfff))
#define PAGE_TABLE_ADDRESS_MASK (~((uint32_t)0xfff))
int main()
{
uint64_t a = PAGE_DIRECTORY_ADDRESS_MASK;
uint64_t b = PAGE_TABLE_ADDRESS_MASK;
if (PAGE_DIRECTORY_ADDRESS_MASK != PAGE_TABLE_ADDRESS_MASK)
printf("Different: %llx %llx\n",PAGE_DIRECTORY_ADDRESS_MASK, PAGE_TABLE_ADDRESS_MASK);
if (a != b)
printf("Different! %llx %llx\n",a, b);
return 0;
}
您对
uint64\u t
使用了错误的格式修改器。无法保证uint64\u t
与unsigned long
相同,它可能是unsigned long
。改用标准。@Someprogrammerdude谢谢你的评论!说得好!我已将代码调整为使用“%llx”
“ll”长度修饰符已添加到C99中的标准C
。
Different: fffffffffffff000 fffff000
Different! fffffffffffff000 fffff000