算术溢出:指对应无符号整数类型的变量,如果某个算术计算结果超出其所能表达的数值范围,就会发生上溢和下溢的现象。
示例上溢
(uint8 A1, uint A2) = (255, 255);
A1 = A1 + 1;
A2 = A2 + 128;
得到结果为A1将为0,A2将为127。
A1计算过程1111 1111 + 0000 0001 = 1 0000 0000,因为uint8 只保留8位进制,“1” 就被舍弃,结果为0000 0000,即0.
A2计算过程1111 1111 + 1000 0000 = 1 0111 1111,同样保留8位进制,结果为0111 1111,即127。
示例下溢
uint8 B1;
uint8 B2;
B1 = B1 - 1;
B2 = B2 - B1;
得到结果为B1将为255,B2将为1。
0000 0000 - 0000 0001 = 1111 1111;即255
0000 0000 - 1111 1111 = 0000 0001;即1
如何避免:使用算术运算库智能合约——SafeMath(uint专属)