试着编译运行下面的几行小程序:
#include <stdio.h> int main() { int a = 0; double d = 3 / a; printf("%lf./n", d); return 0; }
正常编译后,运行发生了异常,程序被终止运行,啥也没打印出来。当然问题也是显然的,严重的除0异常。(没有人会写程序故意除以一个零,但难保来自于其它输入渠道的数据不会导致一个0除数。这里只是个例子,就简单写写了。)
我们再把程序稍微改动一点:
#include <stdio.h> int main() { int a = 0; double d = 3.0 / a; printf("%lf./n", d); return 0; }
只有一处改动:被除数由“3”变成“3.0”。
结果却有所不同。当然,要说不正常结果依旧是不正常。但这次却不是严重的终止了程序的运行时异常,程序本身是正常运行的,而且有结果输出,只不过输出了一个怪怪的东西,标示这个浮点数有问题。
前后的区别在于:在第一种情况下,是两个整数相除,当除数为0时产生一个严重的除0异常,程序被终止运行;在第二种情况下,由于除法运算的第一个操作数为double型,那么除数a也被先提升为double型然后参与运算。浮点运算中,除0错误的结果不是一个运行时异常,而是得到一个“Not A Number”的特殊浮点值作为结果,当这个值被打印时就输出了那个怪怪的东西。
可以联想到的一件事情是:float/double类型是有这种特殊值的,这一点不像各种int类型。一个int,32个bit,不管怎么组合,其结果都是一个合法的int值。但float/double不同,float的32个bit或者double的64个bit,并非每种组合都是合法的。因此通过某种方式随意组织32个bit,来试图形成一个“float随机数”的想法是不正确的。