温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

solidity智能合约[54]-安全—取反

发布时间:2020-07-01 12:18:39 来源:网络 阅读:451 作者:jonson_jackson 栏目:开发技术

相反数

有符号的solidity整数类型如果有N位。那么其值的范围是-2^(N-1) to 2^(N-1)-1。 这意味着该类型负数的最大值取相反数之后不能够被接收。

相反数陷阱

如下的Negation合约说明了负数在面临取相反数操作时可能遇到的问题。由于对于负数取相反数。实则是取负数的补码操作。因此、当某int类型最大的负数取相反数的时候,会是其本身。如当int8的最大值-128传递到negate8执行取反操作的时候,会返回128。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
contract 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、检查是否达到了该类型的最大负数。

  • 本文链接: https://dreamerjonson.com/2018/11/25/solidity-54-negation/

  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY 4.0 CN协议 许可协议。转载请注明出处!

solidity智能合约[54]-安全—取反

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI