所以这是我的代码
double blocksize = 32;
double indexSize, tagSize, offsetSize;
int main(int argc, char** argv) {
double index;
double cachesize = 1;
offsetSize = log(blocksize) / log(2.0);
index = cachesize/blocksize * 1024;
indexSize = (log(index) / log(2.0));
tagSize = 32 - indexSize - offsetSize;
printf("Offset : %f\n", offsetSize);
printf("Index: %f\n", index);
printf("Index : %f\n", indexSize);
printf("Tag : %f\n", tagSize);
return (EXIT_SUCCESS);
}
所以问题是当我将所有内容分配给int时,我得到了这个输出:
抵消:5
指数:0
索引:-2147483648
标签:-2147483621
但是,当我将所有内容都指定为double时,我得到了这个输出:
抵消:5.000000
指数:32.000000
指数:5.000000
标签:22.000000
为什么我会得到两个不同的输出?我认为double和int之间的唯一区别是int是整数但是double不是整数。它将返回类似于我得到的输出5.000000,32.0000等。那么为什么我会得到两个不同的输出呢?
答案 0 :(得分:1)
整数和双精度之间存在很多差异,但是你的例子出错的地方就在这一行:
index = cachesize/blocksize * 1024;
当cachesize
和blocksize
加倍时,它们会进行double
除法,这允许小数位。
当cachesize
和blocksize
为整数时,它们会进行integer
除法,从而截断小数。
要修复您的代码行,您可以将其中一个参数转换为double
以强制double
除法,如下所示:
index = ((double)cachesize / blocksize) * 1024;
这会得到结果:
Offset : 5
Index : 32
Index : 5
Tag : 22