C语言编程时,经常遇到整数运算之后的结果超出计算机能表示数据范围,即溢出。请思考如果发生溢出,会产生什么后果?应该如何避免数据溢出?
无符号超出上限会回到0,即无符号8位整型上限为255,这种类型的变量值到255再加一结果为0。
但是看需要,一般来说大多数的值用long类型都能存下来,而且如果算差值的话重置了也不影响,即无符号8位整型 0 - 255 = 1;
1.对于无符号整形,溢出后会截断,取有效位数据,比如短整形数据(unsigned short)0xffff加1后会出现进位,仅取低2字节为0。
2.对于有符号整形,溢出后会导致数据符号位的变化,比如短整形数据(short)32767加1后为-32768。
3.对于计算公式,从平台寄存器字长考虑,比如对于32位pc机,两个短整形数据(unsigned short)相乘,计算结果会存在32位的寄存器中,结果是永远不会溢出。两个整形数据(unsigned int)相乘,则会有溢出的可能。这种溢出会导致状态寄存器置溢出位。
4.要避免溢出造成的计算结果异常,可以从如下几个方面:
(1)整形计算一定明确取值范围,如有溢出风险可以使用更长字节的整形或浮点类型。
(2)注意类型转换及计算顺序,类型装换会导致精度丧失,计算顺序的不同,结果可能不一样,计算过程中有可能出现溢出现象,比如“先乘后除”和“先除后乘”结果很多时候就不一样。
(3)如果从事嵌入式开发,可以监视一下状态寄存器。
按位取反,省去两个较大值的相加而导致溢出
不使用整数,而使用数组,具体是若加减则以大数为基准,小数在前填充零。然后从最后一位开始相加进位。
乘除则不需要填充零,需要判断进位数,用整数除法来进行运算。望采纳
溢出的话,会截断,丢弃低位数据
解决方法,把int换成long,或者使用数组模拟