为什么1/2在c = -2010232232?

时间:2013-10-09 12:31:16

标签: c floating-point double

我有一个非常简单的C程序。

int main(void){

  double sum = 1/2;

  printf("%d\n", sum);

  return 0;

}

为什么会返回类似" -2030243223"?

的数字

为什么每次运行程序时这个数字都会改变?

我尝试过使用int&float,但我似乎无法将输出设为0.5!

8 个答案:

答案 0 :(得分:11)

使用%f打印double,而不是%d。后者导致未定义的行为

表达式1/2使用整数除法产生0,因此要获得.5,请使用1/2.(注意尾随句点)。

最后,要实际获取.5而不是0.500000之类的内容,请指定精度:

printf("%.1f\n", sum);

答案 1 :(得分:5)

您将IEEE floating-point number传递给printf,但告诉它是一个整数。

更改

printf("%d\n", sum);

printf("%f\n", sum);

如其他评论中所述,您可能还想进行浮点除法而不是整数除法。 1/2为零;你正在划分两个整数,所以结果是一个整数(是的,即使你将它分配给一个浮点变量 - 每个表达式的类型都是孤立地确定的)它必须丢弃其余的。你可能想要1.0/2;如果任一项是浮点数,那么结果是浮点数,所以你得到0.5。

答案 2 :(得分:3)

您正在尝试将双精度打印到整数。 (%d)。

尽管它们都是数字,但内部存在巨大差异,例如记忆差异。

答案 3 :(得分:3)

您正在尝试将double打印为int。尝试使用:

printf("%g\n");

另外,你想要初步划分1.0 / 2.0,否则你会得到0。

答案 4 :(得分:2)

试试这个:

int main(void){

  double sum = 1.0/2.0;

  printf("%10.3f\n", sum);

  return 0;

}

答案 5 :(得分:1)

您的代码存在一些问题

int main(void){
  // you need to divide a double by a double, not two ints
  double sum = 1.0/2.0; 
  // %d is for int, not doubles. You use %f in the case of printing a double
  printf("%f\n", sum); 
  return 0;

}

现在,如果你真的想要将变量打印为int,可以通过执行sum将变量printf("%d\n", (int)sum);转换为int,但是你会遇到舍入问题。

答案 6 :(得分:0)

尝试以下方法:

printf("%f\n", sum);

%d是整数的占位符,也许已打印出sum的地址^^

答案 7 :(得分:0)

糟糕的格式不能是完整的答案,因为:

  • 使用OP的代码,double应为零,存储为0x0000000000000000,无法显示为“-2030243223”(0x86FCF269)。
  • OP说这个值一直在变化。

所以必须有其他的东西,例如缺少标头的事实:我猜编译器不知道printf是一个可变参数函数,并试图通过浮点寄存器传递参数。

printf,作为一个可变函数,可能会尝试从堆栈中读取其输入值,因此是垃圾。