背景:
我正在为一项作业任务编写一个单级缓存模拟器,需要使用C语言,并且必须使用已有的代码。在我们讨论缓存时,我们被告知小缓存可以容纳大地址的方法是将大地址分成缓存中的位置和标识标签。也就是说,如果你有一个8个插槽的缓存,但想存储一个地址大于8的东西,你需要取右侧3位(因为2^3=8),并将数据放在该位置上;例如,如果你有地址22,二进制为10110,则取这3个最右边的位110(十进制为5),并将其放在缓存的第5个插槽中。你还需要在这个位置上存储标记,即剩余的位数10。
当传入addr时,它的实际地址为58,并且它指向值88。我从printf中得到的输出是:
addr is 58, taddr is 58, npos is 0 and ntag is 11
所以似乎taddr得到了58(用%p打印时仍然显示88,用%d打印时显示88),但npos和ntag显示为0和11(好像数学运算是在88上进行的),而不是我想要的2和7。
代码的用法如下:
我正在为一项作业任务编写一个单级缓存模拟器,需要使用C语言,并且必须使用已有的代码。在我们讨论缓存时,我们被告知小缓存可以容纳大地址的方法是将大地址分成缓存中的位置和标识标签。也就是说,如果你有一个8个插槽的缓存,但想存储一个地址大于8的东西,你需要取右侧3位(因为2^3=8),并将数据放在该位置上;例如,如果你有地址22,二进制为10110,则取这3个最右边的位110(十进制为5),并将其放在缓存的第5个插槽中。你还需要在这个位置上存储标记,即剩余的位数10。
其中一个函数cache_load接受一个整数指针作为单一参数。所以实际上,我被给予了这个int* addr,它是一个实际的地址并指向某个值。为了将此值存储在缓存中,我需要拆分addr。然而,编译器不喜欢我直接使用指针。例如,我尝试通过以下方式获取位置:
npos=addr%num_slots
编译器会报错。我尝试将其转换为int类型,但这实际上给我了指针指向的值,而不是数值地址本身。任何帮助都将不胜感激,谢谢!
[编辑]
int load(int * addr) {
int value = (use_memory ? (*addr) : 0);
intptr_t taddr=(intptr_t) addr;
int npos=taddr % blocks;
int ntag=taddr / blocks;
printf("addr is %p, taddr is %p, npos is %d and ntag is %d\n",addr,taddr,npos,ntag);
当传入addr时,它的实际地址为58,并且它指向值88。我从printf中得到的输出是:
addr is 58, taddr is 58, npos is 0 and ntag is 11
所以似乎taddr得到了58(用%p打印时仍然显示88,用%d打印时显示88),但npos和ntag显示为0和11(好像数学运算是在88上进行的),而不是我想要的2和7。
代码的用法如下:
void load_words (int n, int words[]) {
int i;
for (i=0; i<n; i++) {
load( (int *) (words[i] * 4));
cache_print();
}
}
intptr_t
。另外,请发布一些实际的代码。 - Matthew Flaschen%p
以十六进制(基数为16)而不是十进制(基数为10)打印输出,与%d
不同。 - Earlz