快速总结:
import "math/bits"
const (
MaxUint uint = (1 << bits.UintSize) - 1
MaxInt int = (1 << bits.UintSize) / 2 - 1
MinInt int = (1 << bits.UintSize) / -2
)
背景:
如我所知,该uint
类型的大小与uint32
或相同uint64
,这取决于您所使用的平台。通常,只有在没有接近最大值的风险时才使用这些版本的未调整大小版本,因为没有大小规格的版本可以使用“本地”类型,具体取决于平台,这往往会更快。
请注意,它趋向于“更快”,因为使用非本机类型有时需要处理器执行额外的数学运算和边界检查,以模拟更大或更小的整数。考虑到这一点,请注意,处理器(或编译器的优化代码)的性能几乎总是比添加自己的边界检查代码更好,因此,如果有发挥作用的风险,它可能会使简单地使用固定大小的版本,并让优化的仿真处理由此产生的任何后果是合理的。
说了这么多,在某些情况下了解您正在使用的内容很有用。
软件包“ math / bits ”包含的大小uint
,以位为单位。要确定最大值,请移动1
那么多的位,减去-1。即:(1 << bits.UintSize) - 1
请注意,在计算的最大值时uint
,通常需要将其显式地放入uint
(或更大的)变量中,否则编译器可能会失败,因为它将默认尝试将计算分配给有符号的int
(此处应为很明显,它不适合),因此:
const MaxUint uint = (1 << bits.UintSize) - 1
这是您问题的直接答案,但是您可能会对一些相关的计算感兴趣。
根据规格,uint
且int
大小始终相同。
uint
32位或64位
int
与...相同 uint
因此,我们也可以使用该常数来确定最大值int
,方法是采用相同的答案,2
然后除以1
。即:(1 << bits.UintSize) / 2 - 1
和的最小值int
,通过移位1
那么多的位并将结果除以-2
。即:(1 << bits.UintSize) / -2
综上所述:
MaxUint: (1 << bits.UintSize) - 1
MaxInt: (1 << bits.UintSize) / 2 - 1
MinInt: (1 << bits.UintSize) / -2
完整示例(应与以下相同)
package main
import "fmt"
import "math"
import "math/bits"
func main() {
var mi32 int64 = math.MinInt32
var mi64 int64 = math.MinInt64
var i32 uint64 = math.MaxInt32
var ui32 uint64 = math.MaxUint32
var i64 uint64 = math.MaxInt64
var ui64 uint64 = math.MaxUint64
var ui uint64 = (1 << bits.UintSize) - 1
var i uint64 = (1 << bits.UintSize) / 2 - 1
var mi int64 = (1 << bits.UintSize) / -2
fmt.Printf(" MinInt32: %d\n", mi32)
fmt.Printf(" MaxInt32: %d\n", i32)
fmt.Printf("MaxUint32: %d\n", ui32)
fmt.Printf(" MinInt64: %d\n", mi64)
fmt.Printf(" MaxInt64: %d\n", i64)
fmt.Printf("MaxUint64: %d\n", ui64)
fmt.Printf(" MaxUint: %d\n", ui)
fmt.Printf(" MinInt: %d\n", mi)
fmt.Printf(" MaxInt: %d\n", i)
}
int(^uint(0) >> 1) // largest int
自golang.org/doc/effective_go.html#printing