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 }