快速总结:
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
这是对您问题的直接答案,但您可能还对一些相关的计算感兴趣。
根据spec,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
full example(应与下同)
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)
}