我正在尝试编写一个c程序,将厘米转换为英寸然后转换为英尺。我已经编写了大部分代码,但不确定如何调试它。作为我的所有输出,我一直得到“0”。我哪里错了?
#include <stdio.h>
// Main Function
int main(void)
{
//Variable declarations
int centimeters = 0 ;
int inches = 0;
int feet = 0;
/* ... */
// Print a title
printf("Convert centimeters to inches and feet\n");
{
printf("Input Length in Centimeters: "); // Prompt user for input
scanf("%i", & centimeters); // Get input form user for length in cm
}
// conversion calcs
inches = (double)centimeters * 2.54;
feet = (double) inches / 12;
/* ... */
// Print output
printf("Statistics:\n");
printf("centimeters%12f\n", centimeters);
printf("inches%12f\n", inches);
printf("feet%12f\n", feet);
/* ... */
return 0;
答案 0 :(得分:2)
在C中,类型永远不会改变自己。即使您将浮点数分配给整数,整数仍然是整数。对于这样的应用程序,我建议你只需将所有内容都设为浮点数。
//Variable declarations
int centimeters = 0 ;
int inches = 0;
int feet = 0;
应该是
//Variable declarations
double centimeters = 0 ;
double inches = 0;
double feet = 0;
这样,您的printf
语句也可以继续使用%f
来打印数字。您需要将scanf
语句更改为也使用%f
。
至于你为什么得到0作为结果,如果你知道如何在内部存储数字,那么它实际上非常简单。
大多数浮点实现按以下顺序存储位:符号,指数,尾数。如果您的实现使用32位IEEE浮点数,则前8位用于符号和指数,最后24位用于尾数。这意味着,如果您的值完全适合单个字节(介于0和255之间),那么如果读取为float,则它将为0,因为尾数将完全为空。
这是因为大多数基于英特尔的台式计算机以小端格式存储它们的字节,这意味着最低有效字节首先出现,最重要的是最后一个字节。例如,在little-endian机器中,表示这些值的32位数字将存储为:
0x01: 0x01 0x00 0x00 0x00
0xFF: 0xFF 0x00 0x00 0x00
0x1FF: 0xFF 0x01 0x00 0x00
0xA0F00D: 0x0D 0xF0 0xA0 0x00
And so on...
因此,如果您的值小于0x100(255或更低),那么它将只占用内存的第一个字节。碰巧的是,32位浮点数的前8个字节没有任何有效数字,因此如果它被读作浮点数,它将被视为0。
64位浮点数(双精度数)使用前11位作为其符号和指数,因此您可以将值一直隐藏到2048中。
编辑:只是一个附录,因为最近有人对此进行了投票:
这篇文章并不完全错误,但是我没有提到这样一个事实:如果指数不是全零,则在尾数中设置一个隐含的前导位(一个,可以这么说)。在这种情况下,它被称为标准化值,它永远不会为零。只有当数字被非规范化时(所有指数位都未设置/归零),才能得到真正的零值。
如果用户要将一个介于0到15之间或介于128和143之间的值存储到32位浮点数的前8位中,那么将给出一个指数,该指数将使所表示的值如此之小以至于大多数显示函数将舍入它归零。这是因为这将导致非常小的指数,因为0-15仅消耗低4位,并且128-143是具有最高有效位设置的相同值(其可能最终在符号位中)。具体映射取决于机器如何对其位进行排序。
答案 1 :(得分:1)
您使用的格式错误。而不是%12f
,请使用%12d
。
printf("centimeters%12d\n", centimeters);
printf("inches%12d\n", inches);
printf("feet%12d\n", feet);
虽然你会失去小数值,但这可能是你的意图。但是,将int
传递给期望printf
的{{1}}会导致未定义的行为。
在http://ideone.com/JdjE3z使用double
vs %12f
时,请查看输出的差异。
答案 2 :(得分:0)
int main()
{
float c = 0.0,i = 0.0; // c = centimeters, i = inches
int f = 0; // f = feet
printf("Input length in centimeter: ");
scanf("%f",&c);
f = (c / 2.54) / 12;
i = (c / 2.54) - (f * 12);
printf("%.1f centimeters is %d feet %.1f inches.\n",c,f,i);
exit ( 0 );
}