github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/common/math/integer.go (about)

     1  
     2  //此源码被清华学神尹成大魔王专业翻译分析并修改
     3  //尹成QQ77025077
     4  //尹成微信18510341407
     5  //尹成所在QQ群721929980
     6  //尹成邮箱 yinc13@mails.tsinghua.edu.cn
     7  //尹成毕业于清华大学,微软区块链领域全球最有价值专家
     8  //https://mvp.microsoft.com/zh-cn/PublicProfile/4033620
     9  //版权所有2017 Go Ethereum作者
    10  //此文件是Go以太坊库的一部分。
    11  //
    12  //Go-Ethereum库是免费软件:您可以重新分发它和/或修改
    13  //根据GNU发布的较低通用公共许可证的条款
    14  //自由软件基金会,或者许可证的第3版,或者
    15  //(由您选择)任何更高版本。
    16  //
    17  //Go以太坊图书馆的发行目的是希望它会有用,
    18  //但没有任何保证;甚至没有
    19  //适销性或特定用途的适用性。见
    20  //GNU较低的通用公共许可证,了解更多详细信息。
    21  //
    22  //你应该收到一份GNU较低级别的公共许可证副本
    23  //以及Go以太坊图书馆。如果没有,请参见<http://www.gnu.org/licenses/>。
    24  
    25  package math
    26  
    27  import (
    28  	"fmt"
    29  	"strconv"
    30  )
    31  
    32  //整数限制值。
    33  const (
    34  	MaxInt8   = 1<<7 - 1
    35  	MinInt8   = -1 << 7
    36  	MaxInt16  = 1<<15 - 1
    37  	MinInt16  = -1 << 15
    38  	MaxInt32  = 1<<31 - 1
    39  	MinInt32  = -1 << 31
    40  	MaxInt64  = 1<<63 - 1
    41  	MinInt64  = -1 << 63
    42  	MaxUint8  = 1<<8 - 1
    43  	MaxUint16 = 1<<16 - 1
    44  	MaxUint32 = 1<<32 - 1
    45  	MaxUint64 = 1<<64 - 1
    46  )
    47  
    48  //hexordecimal64将uint64封送为十六进制或十进制。
    49  type HexOrDecimal64 uint64
    50  
    51  //UnmarshalText实现encoding.textUnmarshaller。
    52  func (i *HexOrDecimal64) UnmarshalText(input []byte) error {
    53  	int, ok := ParseUint64(string(input))
    54  	if !ok {
    55  		return fmt.Errorf("invalid hex or decimal integer %q", input)
    56  	}
    57  	*i = HexOrDecimal64(int)
    58  	return nil
    59  }
    60  
    61  //MarshalText实现Encoding.TextMarshaler。
    62  func (i HexOrDecimal64) MarshalText() ([]byte, error) {
    63  	return []byte(fmt.Sprintf("%#x", uint64(i))), nil
    64  }
    65  
    66  //ParseUInt64以十进制或十六进制语法解析为整数。
    67  //可接受前导零。空字符串解析为零。
    68  func ParseUint64(s string) (uint64, bool) {
    69  	if s == "" {
    70  		return 0, true
    71  	}
    72  	if len(s) >= 2 && (s[:2] == "0x" || s[:2] == "0X") {
    73  		v, err := strconv.ParseUint(s[2:], 16, 64)
    74  		return v, err == nil
    75  	}
    76  	v, err := strconv.ParseUint(s, 10, 64)
    77  	return v, err == nil
    78  }
    79  
    80  //mustParseUInt64作为整数进行分析,如果字符串无效,则会恐慌。
    81  func MustParseUint64(s string) uint64 {
    82  	v, ok := ParseUint64(s)
    83  	if !ok {
    84  		panic("invalid unsigned 64 bit integer: " + s)
    85  	}
    86  	return v
    87  }
    88  
    89  //注意:以下方法需要使用位检查或ASM进行优化
    90  
    91  //SAFESUB返回减法结果以及是否发生溢出。
    92  func SafeSub(x, y uint64) (uint64, bool) {
    93  	return x - y, x < y
    94  }
    95  
    96  //safeadd返回结果以及是否发生溢出。
    97  func SafeAdd(x, y uint64) (uint64, bool) {
    98  	return x + y, y > MaxUint64-x
    99  }
   100  
   101  //safemul返回乘法结果以及是否发生溢出。
   102  func SafeMul(x, y uint64) (uint64, bool) {
   103  	if x == 0 || y == 0 {
   104  		return 0, false
   105  	}
   106  	return x * y, y > MaxUint64/x
   107  }