Краткое резюме:
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
И минимальное значение 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"
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
извлеченный из golang.org/doc/effective_go.html#printing