Resumo rápido:
import "math/bits"
const (
MaxUint uint = (1 << bits.UintSize) - 1
MaxInt int = (1 << bits.UintSize) / 2 - 1
MinInt int = (1 << bits.UintSize) / -2
)
Fundo:
Como presumo que você saiba, o uint
tipo é do mesmo tamanho que um uint32
ou outro uint64
, dependendo da plataforma em que você está. Normalmente, a versão sem tamanho seria usada apenas quando não há risco de se aproximar do valor máximo, pois a versão sem especificação de tamanho pode usar o tipo "nativo", dependendo da plataforma, que tende a ser mais rápida.
Observe que ele tende a ser "mais rápido" porque o uso de um tipo não-nativo às vezes exige que seja feita uma verificação matemática e de limites adicional pelo processador, a fim de emular o número inteiro maior ou menor. Com isso em mente, esteja ciente de que o desempenho do processador (ou código otimizado do compilador) quase sempre será melhor do que adicionar seu próprio código de verificação de limites; portanto, se houver algum risco de entrar em jogo, isso poderá prejudicar É bom usar simplesmente a versão de tamanho fixo e deixar a emulação otimizada lidar com qualquer problema disso.
Com isso dito, ainda existem algumas situações em que é útil saber com o que você está trabalhando.
O pacote " math / bits " contém o tamanho de uint
, em bits. Para determinar o valor máximo, altere 1
o número de bits menos 1. ie:(1 << bits.UintSize) - 1
Observe que, ao calcular o valor máximo de uint
, geralmente você precisará colocá-lo explicitamente em uma uint
variável (ou maior); caso contrário, o compilador poderá falhar, pois o padrão será tentar atribuir esse cálculo a um sinal assinado int
(onde, como deveria seja óbvio, não caberia), então:
const MaxUint uint = (1 << bits.UintSize) - 1
Essa é a resposta direta à sua pergunta, mas também existem alguns cálculos relacionados nos quais você pode estar interessado.
De acordo com as especificações , uint
e int
são sempre do mesmo tamanho.
uint
32 ou 64 bits
int
mesmo tamanho que uint
Portanto, também podemos usar essa constante para determinar o valor máximo de int
, pegando a mesma resposta e dividindo 2
e subtraindo 1
. ou seja:(1 << bits.UintSize) / 2 - 1
E o valor mínimo de int
, deslocando-se 1
por tantos bits e dividindo o resultado por -2
. ou seja:(1 << bits.UintSize) / -2
Em suma:
MaxUint: (1 << bits.UintSize) - 1
MaxInt: (1 << bits.UintSize) / 2 - 1
MinInt: (1 << bits.UintSize) / -2
exemplo completo (deve ser o mesmo que abaixo)
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
extraído de golang.org/doc/effective_go.html#printing #