【问题标题】:Why am I getting two different outputs in c when I use int or double?当我使用 int 或 double 时,为什么我会在 c 中得到两个不同的输出?
【发布时间】:2025-11-30 12:15:01
【问题描述】:

这是我的代码

  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

但是,当我将所有内容分配为双精度时,我会得到以下输出:

偏移量:5.000000

指数:32.000000

索引:5.000000

标签:22.000000

为什么我得到两个不同的输出?我认为 double 和 int 之间的唯一区别是 int 是整数,但 double 不是整数。它将作为输出返回,类似于我得到的 5.000000、32.0000 等。那么为什么我会得到两个不同的输出呢?

【问题讨论】:

  • a/b 带整数也会进行整数除法,即 2/3 => 0。
  • 当您在算术运算中使用整数时,结果会在每个点被截断为整数。例如,10/20*200,但 10.0/20.0*20.010.0

标签: c


【解决方案1】:

整数和双精度数之间有很多区别,但是您的示例出错的地方在这一行:

index = cachesize/blocksize * 1024;

cachesizeblocksize 是双精度时,它们会进行double 除法,这允许使用小数位。

cachesizeblocksize 是整数时,它们正在执行integer 除法,这会截断小数。

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

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

这将为您带来结果:

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

【讨论】:

    最近更新 更多