整数上溢和下溢与浮点上溢和下溢

整数的上溢

#include
#include
int main()
{
int zhengshu1,zhengshu2;//int 类型在32位机器中通常为32位
unsigned int zhengshu3;
zhengshu1=2147483647;
zhengshu2=-2147483647;
zhengshu3=4294967295;
//fudianshu1=0.1;
//fudianshu2=0.0222222222222222222222222221222222222222222222222222222222222222;
printf("%d\t%d\t%d\n",zhengshu1,zhengshu1+1,zhengshu1+2);//有符号数的上溢,直接从-2147483648开始
printf("%d\t%d\t%d\n",zhengshu2,zhengshu2-1,zhengshu2-2);//下溢也从-2147483648开始
printf("%u\t%u\t%u\n",zhengshu3,zhengshu3+1,zhengshu3+2);//无符号数上溢从0开始
return 0;
}

负数在计算机内部表示通常用补码表示,因此当7FFF(H)+1时,由于溢出变成8000(H),此时,符号位由于溢出,变为1即负0,因此计算机认为这是-2147483648的补码,从而上溢从-2147483648开始。

下溢时,FFFF(H),在计算机中补码表示为8001(H),在计算机内部计算时候,溢出从8000(H)开始。在计算机内部每一个补码,对应一个真正的数字,在内部计算使用补码。

浮点数上溢:超过浮点数的最大表示范围,即发生上溢。通常最大为3.4E38

int main(void)  
{  
    float a = 3.4E38 * 100.0f;  
    printf("%e\n", a);  
    return 0;  

浮点数下溢:低于一个正常的浮点值,即发生下溢。通常最小正浮点数为1.4E-45

#include  
int main(void)  
{  
    float b = 1.4E-45/10.0;  
    printf("%e\n", b);  
    return 0;  
}  

关于浮点数另外需要注意的一个问题就是精度在计算中的丢失,从而产生误差的问题。



你可能感兴趣的:(C语言)