上溢
当计算值的值过大时,超出当前类型表示范围,就会发生上溢,如:
int main()
{
float b =3.4e38*100.0f;
printf("%e", b);
return 0;
}
以前这种情况是未定义的,现在C语言规定,这种情况下会给b一个表示无穷大的特定值用pintf()显示为inf或infinity(或其它内容)。
下溢
当对一个很小的数做除法时,情况更复杂。float是用指数和尾数部分来存储。假设有这样一个数,它的指数部分是最小值,即全部可用位表示尾数最小值该数是float类型精度表示的最小数字,现在把它除2,通常是指数部分减少。但这个假设中指数已经最小了,所以只好把尾数部分的位往右移动空出一个二进制位,并丢弃最后一个二进制数。以十进制为例:(0.1234e-10)除以十,得到结果为0.01234e-10。虽然得到了结果,但是计算过程中损失了原末尾的有效位上的数字,这叫下溢。C语言把这种损失了类型全精度的浮点值叫做低于正常的浮点值。
如果除以一个非常大的值,会导致所有的位都为零。