将int转换为double

use*_*165 4 c printf

我跑这个简单的程序,但是当我从转换intdouble,结果是零.的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));


}
Run Code Online (Sandbox Code Playgroud)

Eri*_*ith 11

也许这个?

int number;
double dblNumber = (double)number;
Run Code Online (Sandbox Code Playgroud)

  • 奇怪的是,他的问题的标题是.那好吧. (9认同)

Art*_*tur 7

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

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

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

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

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

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

float myFloat = 8.0;
printf( "%08X\n", *((unsigned int*)&myFloat) );
Run Code Online (Sandbox Code Playgroud)

打印:"41000000"

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