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 大小(译者注:UintSize )。要确定最大值,将 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
完整示例(应与下图相同):
package main
import (
"fmt"
"math"
"math/bits"
"runtime"
"strconv"
)
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)
fmt.Println("MaxUint:", uint(math.MaxUint))
fmt.Println("MinInt:", math.MinInt)
fmt.Println("MaxInt:", math.MaxInt)
fmt.Println("系统架构:", runtime.Compiler, runtime.GOARCH, runtime.GOOS)
fmt.Println("Int 大小:", strconv.IntSize)
}
输出
MinInt32: -2147483648
MaxInt32: 2147483647
MaxUint32: 4294967295
MinInt64: -9223372036854775808
MaxInt64: 9223372036854775807
MaxUint64: 18446744073709551615
MaxUint: 18446744073709551615
MinInt: -9223372036854775808
MaxInt: 9223372036854775807
MaxUint: 18446744073709551615
MinInt: -9223372036854775808
MaxInt: 9223372036854775807
系统架构: gc amd64 darwin
Int 大小: 64