< p >
注意:截至Go 1.17,本答案已被取代,其中包括e8eb1d8;即math
包现在包括math.MaxUint
、math.MaxInt
和math.MinInt
常量。简要概述:
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
并且通过将1
向左移动那么多位并将结果除以-2
,来确定int
的最小值。即:(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
,它来自于 https://golang.org/doc/effective_go.html#printing。 - Victor