在计算机中,当要表示的数据超出计算机所使用的数据的表示范围时,则产生数据的溢出。要想很好的避免这个问题,首先我们需要了解常用的数据类型的取值范围:
1.C语言的基本数据类型及其取值范围:
数据类型 所占位数 取值范围
[signed] char 8 -2^7 ~ 2^7-1
unsigned char 8 0 ~ 2^8-1
[signed] short 16 -2^15 ~ 2^15-1
unsigned short 16 0 ~ 2^16-1
[signed] int 32 -2^31 ~ 2^31-1
unsigned int 32 0 ~ 2^32-1
[signed] long 32 -2^31 ~ 2^31-1
unsigned long 32 0 ~ 2^32-1
float 32 -3.4*10(-38)~3.4*10(38)
double 64 -1.7*10(-308)~1.7*10(308)
2.溢出后数值计算:
[MAX_COUNT]表示类型能表示的数据个数,如char类型(8位)可表示2^8=256
(1)上溢:-[MAX_COUNT].
(2)下溢:+[MAX_COUNT]
例1:上溢 char a = 126,则a+45 = ? Uchar b = 252 则 b + 100 = ?
解:a+45 = 126 + 45 = 171-256 = -85
b+100 = 252 + 100 =352-256 = 96
例2:下溢 char a = 126,则a+45 = ? Uchar b = 2 则 b -100 = ?
解:a+45 = 126 + 45 = 171-256 = -85
b-100 = 2 - 100 = -98+256 =158
3.有符号数和无符号数的转换:
(1)无符号a->有符号b:
if(a<[MAX_COUNT]/2)
{
b = a;
}else{
b = a - [MAX_COUNT]
}
(2)有符号a->无符号b:
if(a>=0)
{
b = a;
}else{
b = a + [MAX_COUNT]
}
这个就不举例子了,读者可以自己验证!!!