当我使用int或double时,为什么我在c中得到两个不同的输出?

时间:2016-04-26 00:58:14

标签: c

所以这是我的代码

  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等。那么为什么我会得到两个不同的输出呢?

1 个答案:

答案 0 :(得分:1)

整数和双精度之间存在很多差异,但是你的例子出错的地方就在这一行:

index = cachesize/blocksize * 1024;

cachesizeblocksize加倍时,它们会进行double除法,这允许小数位。

cachesizeblocksize为整数时,它们会进行integer除法,从而截断小数。

要修复您的代码行,您可以将其中一个参数转换为double以强制double除法,如下所示:

index = ((double)cachesize / blocksize) * 1024;

这会得到结果:

Offset : 5
Index  : 32
Index  : 5
Tag    : 22