从刚学计算机器就对进制转换有着莫名的反感,2进制 8进制 10进制 16进制各种转换。
下面就说下逻辑地址转换成物理地址的求法吧
首先,用户输入一个16进制的数字cin>>hex>>logic_add; hex的意思是告诉计算机输入的数是以16进制方式输入的
这个时候你要是输出cout<<logic_add; 你会发现输出的是把这个16进制的数转换为10进制以后输出的结果
cout<<hext<<logic_add;这样输出的才是16进制。
经过以上对比,原来计算机不管你是以什么进制方式输出的最后都以10进制形式显示在你面前。
接着输入你的页面大小,如果是1kb=1024b=210
这时候用你的 逻辑地址/页面大小=页号.....页内地址
写这个的时候我觉得我自己笨的要死,我在想逻辑地址是16进制的 页面大小是10进制的一个数 他们之间相除用不用进制转换之类的,我就一直试啊在此期间不停的让他们进制统一!!!
一瞬间突然想明白了,在计算机里你无论是以什么方式什么进制输入的最后都变成2进制,不需要你自己转换进制,最后的商打印出的是10进制(在计算机内部算出的结果是2进制,默认输出的是10进制)。
哎,所以
cin>>hex>>logic_add;
int a=logic_add/page_size*1024;//页号
int b=logic_add%page_size*1024;//页内地址
这就完事了!!!!!!!!
之后你再去查页表找到对应的物理块号c
c*page_size+b;//物理地址,十进制的
cout<<hex<<c*page_size+b;//16进制的
就是么简单,真是够了,有些时候特别简单的问题自己不认真思考真的是不能很好理解。
老师上课讲给一个逻辑地址:0A5C 页面大小1kb=210
0A5C/2^10 商就是前6位 余数就是后10位
这么理解:0A5C化成2进制一共16位0000 1010 0101 1100 除以2的10次方(2进制位100 0000 0000)就相当于十进制100除以10小数点向前移动1位
那么2^10 就是二进制的小数点向前移动10位 (整数小数在末尾)
不知道我说明白没~
欢迎指正~~~~
奋斗中的我,十一就不回家了~哎~~~所以挺闹心的,大家都走了,我也心不在焉。希望明天一切顺利