Sumario 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
)
Antecedentes:
Como supongo que ya sabes, el uint
tipo es del mismo tamaño que sea uint32
o uint64
, dependiendo de la plataforma que se encuentra. Por lo general, uno usaría la versión sin tamaño de estos solo cuando no haya riesgo de acercarse al valor máximo, ya que la versión sin una especificación de tamaño puede usar el tipo "nativo", dependiendo de la plataforma, que tiende a ser más rápido.
Tenga en cuenta que tiende a ser "más rápido" porque el uso de un tipo no nativo a veces requiere que el procesador realice una comprobación matemática y de límites adicional para emular el número entero más grande o más pequeño. Con eso en mente, tenga en cuenta que el rendimiento del procesador (o el código optimizado del compilador) casi siempre será mejor que agregar su propio código de verificación de límites, por lo que si existe algún riesgo de que entre en juego, puede tiene sentido usar simplemente la versión de tamaño fijo y dejar que la emulación optimizada se encargue de las consecuencias de eso.
Dicho esto, todavía hay algunas situaciones en las que es útil saber con qué está trabajando.
El paquete " matemáticas / bits " contiene el tamaño de uint
, en bits. Para determinar el valor máximo, cambie 1
esa cantidad de bits, menos 1. es decir:(1 << bits.UintSize) - 1
Tenga en cuenta que al calcular el valor máximo de uint
, generalmente tendrá que ponerlo explícitamente en una uint
variable (o más grande), de lo contrario, el compilador puede fallar, ya que de forma predeterminada intentará asignar ese cálculo a un signoint
(donde, como debería sea obvio, no encajaría), entonces:
const MaxUint uint = (1 << bits.UintSize) - 1
Esa es la respuesta directa a su pregunta, pero también hay algunos cálculos relacionados que pueden interesarle.
Según la especificación , uint
y int
siempre son del mismo tamaño.
uint
ya sea 32 o 64 bits
int
mismo tamaño que uint
Entonces, también podemos usar esta constante para determinar el valor máximo de int
, tomando esa misma respuesta y dividiendo para 2
luego restar1
. es decir:(1 << bits.UintSize) / 2 - 1
Y el valor mínimo de int
, cambiando 1
por tantos bits y dividiendo el resultado entre -2
. es decir:(1 << bits.UintSize) / -2
En resumen:
MaxUint: (1 << bits.UintSize) - 1
MaxInt: (1 << bits.UintSize) / 2 - 1
MinInt: (1 << bits.UintSize) / -2
ejemplo completo (debe ser el mismo que se muestra a continuación)
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