我有一个非常简单的 C 程序。
int main(void){
double sum = 1/2;
printf("%d\n", sum);
return 0;
}
为什么它会返回像“-2030243223”这样的数字?
为什么每次运行程序时这个数字都会改变?
我试过使用int和float,但我似乎无法让输出为0.5!?
我有一个非常简单的 C 程序。
int main(void){
double sum = 1/2;
printf("%d\n", sum);
return 0;
}
为什么它会返回像“-2030243223”这样的数字?
为什么每次运行程序时这个数字都会改变?
我试过使用int和float,但我似乎无法让输出为0.5!?
用于%f
打印 a double
,而不是%d
。后者导致未定义的行为。
该表达式还1/2
使用整数除法来产生0
,因此要获取.5
,请使用1/2.
(注意尾随句点)。
最后,要实际得到.5
而不是类似的东西0.500000
,请指定精度:
printf("%.1f\n", sum);
您将IEEE 浮点数传递给printf
,但告诉它它是一个整数。
改变
printf("%d\n", sum);
至
printf("%f\n", sum);
如其他评论中所述,您可能还想进行浮点除法而不是整数除法。1/2
为零;您将两个整数相除,因此结果是一个整数(是的,即使您要将它分配给一个浮点变量——每个表达式的类型都是单独确定的)并且它必须丢弃余数。你可能想要1.0/2
;如果任一项是浮点数,则结果是浮点数,因此您将得到 0.5。
您正在尝试将双精度打印到整数。(%d)。
尽管它们都是数字,但在内部存在巨大差异,例如内存差异。
您正在尝试将 double 作为 int 打印。尝试使用:
printf("%g\n");
此外,您需要将初始除法设为 1.0/2.0,否则您将得到 0。
尝试这个:
int main(void){
double sum = 1.0/2.0;
printf("%10.3f\n", sum);
return 0;
}
您的代码有几个问题
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);
,但您将遇到舍入问题。
错误的格式不能是全部答案,因为:
double
应该为零,存储为0x0000000000000000,不能显示为“-2030243223”(0x86FCF269)。所以肯定有其他的东西,例如缺少标头的事实:我猜编译器不知道printf
是可变参数函数,并试图通过浮点寄存器传递参数。
printf
,作为一个可变参数函数,可能会尝试从堆栈中读取其输入值,因此是垃圾。
尝试以下操作:
printf("%f\n", sum);
%d 是整数的占位符,可能 sum 的地址已经打印出来了^^