将int转换为double

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

 /* Hello World program */ #include #include 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)); } 

问题是不正确使用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”

根据单精度浮点编码格式 。 8.0简单地是(-1)^ 0 *(1 +分数= 0)* 2 ^(exp = 130-127)= 2 * 3 = 8.0但是打印为int看起来只有41000000(当然是hex)。

也许这个?

 int number; double dblNumber = (double)number; 

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 */ 

只要示波器中有原型, sqrt()i参数就会隐式转换为double。 由于您包含了正确的标头,因此无需进行显式转换。