0

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

int main(void){

  double sum = 1/2;

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

  return 0;

}

为什么它会返回像“-2030243223”这样的数字?

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

我试过使用int和float,但我似乎无法让输出为0.5!?

4

8 回答 8

11

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

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

最后,要实际得到.5而不是类似的东西0.500000,请指定精度:

printf("%.1f\n", sum);
于 2013-10-09T12:33:32.290 回答
5

您将IEEE 浮点数传递给printf,但告诉它它是一个整数。

改变

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

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

如其他评论中所述,您可能还想进行浮点除法而不是整数除法。1/2为零;您将两个整数相除,因此结果是一个整数(是的,即使您要将它分配给一个浮点变量——每个表达式的类型都是单独确定的)并且它必须丢弃余数。你可能想要1.0/2;如果任一项是浮点数,则结果是浮点数,因此您将得到 0.5。

于 2013-10-09T12:33:47.363 回答
3

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

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

于 2013-10-09T12:33:40.237 回答
3

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

printf("%g\n");

此外,您需要将初始除法设为 1.0/2.0,否则您将得到 0。

于 2013-10-09T12:33:51.237 回答
2

尝试这个:

int main(void){

  double sum = 1.0/2.0;

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

  return 0;

}
于 2013-10-09T12:33:37.783 回答
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通过执行将变量转换为 int printf("%d\n", (int)sum);,但您将遇到舍入问题。

于 2013-10-09T12:35:33.730 回答
0

错误的格式不能是全部答案,因为:

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

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

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

于 2013-10-09T12:47:12.073 回答
0

尝试以下操作:

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

%d 是整数的占位符,可能 sum 的地址已经打印出来了^^

于 2013-10-09T12:36:30.623 回答