solidity智能合约[54]-安全—取反 2018-11-25 智能合约 solidity语法 solidity, 以太坊, 智能合约 0 评论 字数统计: 250(字) 阅读时长: 1(分) 相反数 有符号的solidity整数类型如果有N位。那么其值的范围是-2^(N-1) to 2^(N-1)-1。 这意味着该类型负数的最大值取相反数之后不能够被接收。 相反数陷阱 如下的Negation合约说明了负数在面临取相反数操作时可能遇到的问题。由于对于负数取相反数。实则是取负数的补码操作。因此、当某int类型最大的负数取相反数的时候,会是其本身。如当int8的最大值-128传递到negate8执行取反操作的时候,会返回128。 123456789101112131415contract Negation { function negate8(int8 _i) public pure returns(int8) { return -_i; } function negate16(int16 _i) public pure returns(int16) { return -_i; } int8 public d = negate8(127); // -127 int8 public a = negate8(-128); // -128 int16 public b = negate16(-128); // 128 int16 public c = negate16(-32768); // -32768} 解决办法 1、使用更大的类型来接收可以避免出现问题。 2、检查是否达到了该类型的最大负数。