解释发生了什么(C程序)

时间:2014-03-01 13:12:30

标签: java c memory operating-system computer-science

假设系统具有64位虚拟地址,页面大小为8 kb。写一个C程序 在命令行上传递一个虚拟地址(十进制)并让它输出页面 给定地址的数量和偏移量。例如,您的程序将按如下方式运行: ./a.out 8219986 该计划将输出: 地址8219986包含: 页码:1003 偏移= 3410 所有计算必须以二进制方式完成。

#include <stdio.h>
int main(int argc,char *argv[])
{
    unsigned long long int MappedAdress = atoll(argv[1]);
    unsigned long long int page = MappedAdress;
    unsigned long long int offset = MappedAdress;
    //print long long address
    printf("The MappedAdress %llu contains:\n",MappedAdress);
    //shift to right 13 bit to retrive pages, then print
    page = page >> 13;
    printf("Page Number : %llu\n",page);
    //since it's 64-bit opr. Add offset AND 1FFF , 
    offset = offset & 0x1FFF;
    //print the offset
    printf("Offset = %llu\n\n",offset);
    return 0;
}

任何人都可以向我解释刚刚发生在这里的事吗?如果我没有C语言的背景,我该怎么做才能编写这样的程序但是用Java编写?

2 个答案:

答案 0 :(得分:0)

  

有谁可以向我解释刚刚发生在这里的事情?

粗略地说,您使用右移运算符(>>)和按位AND运算符(&)将地址64位虚拟地址转换为虚拟页码和偏移量。 / p>

  

只要我没有C语言背景,我该怎么做才能用Java编写这样的程序?

你应该做的是阅读你的Java教科书或讲义,以了解>>&运算符(对于整数操作数)以及它们的作用。然后用Java编写等效代码。

提示:

  1. >>和按位&运算符在C和Java中的含义几乎相同。
  2. 您可能还应该阅读讲师讲解虚拟地址及其工作方式的讲义。

答案 1 :(得分:0)

LEt回到问题陈述:如果一个64位数字代表一个具有8K大小页面的计算机上的字节地址,则返回该地址的页码和偏移量。

这只是意味着您使用数字/ 8K来获取页面地址,其余部分是平局偏移。当然,通常可以通过使用右移来获取页码和掩码来获得偏移量来更快地计算(但是在64位数字中处理前导“1”位)。

你不需要C程序来弄清楚如何将64位数字分成两个所需的部分。