将int转换为double

时间:2012-01-28 19:07:42

标签: c printf

我运行了这个简单的程序,但是当我从int转换为double时,结果为零。然后,sqrt的零显示负值。这是一个在线教程的例子,所以我不确定为什么会这样。我试过Windows和Unix。

/* Hello World program */

#include<stdio.h>
#include<math.h>

main()

{  int i;

   printf("\t Number \t\t Square Root of Number\n\n");

   for (i=0; i<=360; ++i)
        printf("\t %d \t\t\t %d \n",i, sqrt((double) i));


}

3 个答案:

答案 0 :(得分:11)

也许这个?

int number;
double dblNumber = (double)number;

答案 1 :(得分:7)

问题是不正确使用printf格式 - 使用%g /%f而不是%d

顺便说一下 - 如果你想知道你的代码在这里做了什么,可以帮助你理解一些简略的解释:

printf例程已将sqrt的浮点结果视为整数。有符号的无符号整数有其基础位表示(简单地说 - 就像它们在内存,寄存器等中'编码'的方式一样。通过为printf指定格式,您可以告诉它如何解密特定存储区/寄存器中的位模式(取决于调用约定等)。例如:

unsigned int myInt = 0xFFFFFFFF;
printf( "as signed=[%i] as unsigned=[%u]\n", myInt, myInt );

给出:“as signed = [ - 1] as unsigned = [4294967295]”

使用了一个位模式,但稍后将其视为已签名且未签名。这同样适用于您的代码。您已经告诉printf将用于“编码”sqrt的浮点结果的位模式视为整数。见:

float myFloat = 8.0;
printf( "%08X\n", *((unsigned int*)&myFloat) );

打印:“41000000”

根据single precision floating point encoding format。 8.0只是(-1)^ 0 *(1 +分数= 0)* 2 ^(exp = 130-127)= 2 * 3 = 8.0但是打印为int看起来只有41000000(当然是十六进制)。

答案 2 :(得分:2)

sqrt()返回double类型的值。您无法使用转化说明符"%d"打印此类值。

尝试以下两种选择之一

        printf("\t %d \t\t\t %f \n",i, sqrt(i)); /* use "%f" */
        printf("\t %d \t\t\t %d \n",i, (int)sqrt(i)); /* cast to int */

i的{​​{1}}参数隐式转换为double,只要范围内有原型。由于您包含了正确的标头,因此无需进行显式转换。