我有一个非常简单的 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 的地址已经打印出来了^^