判断整数数据溢出新思路

判断整数溢出有很多种办法,比如与运算前数据作比较,与当前类型上下限做运算判断等等……

这里贴出几个相关的文章做引子:

如何判断整数数据的溢出

整数溢出,如何判断整数溢出

 

我要分享一个新的判断方法:

判断整数数据溢出新思路_第1张图片

基础知识

类型常用名称 类型基本写法 长度(Byte) 范围
UNIT8 unsigned char 1 0 - 255
UNIT16 unsigned short 2 0 - 65,535
UNIT32 unsigned int 4 0-4,294,967,295
UNIT64 unsigned long long 8 0 - 18,446,744,073,709,551,615

一般的c++代码里,会给如上的数据类型进行预定义名称,写法各异,但是大体相近。

 

函数分析

我们先从输入分析:

CalFormula : 运算的结果

result : 不发生溢出的值

这里做了一个妥协,就是如果CalFormula得到的值是溢出的,那么在Assert错误之后,使用result的值。

 

再分析函数体:

result = (UINT16)CalFormula    - > 通过一个不可能溢出的范围去保存计算结果

(UINT8)result ! = result     - > 然后再将结果变回原来的范围,通过判断前后是否相等来确定溢出。

 

结论

通过缩小数据类型长度的判断方法,出发点是溢出的本质:

目标数据超出所使用的数据类型的表示范围

比起针对特定算法的溢出判断,这种写法更具一般性。

PS:不用纠结里面的UINT8或者UINT16 这里只是做个表示,表明数据类型的范围扩大与缩小,实际使用根据具体而定。

你可能感兴趣的:(C++)