我跑这个简单的程序,但是当我从转换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));
}
Run Code Online (Sandbox Code Playgroud)
Eri*_*ith 11
也许这个?
int number;
double dblNumber = (double)number;
Run Code Online (Sandbox Code Playgroud)
问题是不正确使用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(当然是十六进制).