Szybkie podsumowanie:
import "math/bits"
const (
MaxUint uint = (1 << bits.UintSize) - 1
MaxInt int = (1 << bits.UintSize) / 2 - 1
MinInt int = (1 << bits.UintSize) / -2
)
Tło:
Jak przypuszczam, wiesz, uint
typ jest tego samego rozmiaru co jeden z nich uint32
lub uint64
, w zależności od platformy, na której się znajdujesz. Zwykle używa się ich wersji bez rozmiaru tylko wtedy, gdy nie ma ryzyka zbliżenia się do wartości maksymalnej, ponieważ wersja bez specyfikacji rozmiaru może używać typu „natywnego”, w zależności od platformy, który jest zwykle szybszy.
Zwróć uwagę, że zwykle jest to „szybsze”, ponieważ użycie typu innego niż natywny czasami wymaga dodatkowego obliczenia matematycznego i sprawdzenia granic, które musi wykonać procesor, aby emulować większą lub mniejszą liczbę całkowitą. Mając to na uwadze, pamiętaj, że wydajność procesora (lub zoptymalizowanego kodu kompilatora) prawie zawsze będzie lepsza niż dodawanie własnego kodu sprawdzającego granice, więc jeśli istnieje jakiekolwiek ryzyko, że wejdzie on do gry, może to spowodować sens, aby po prostu użyć wersji o stałym rozmiarze i pozwolić zoptymalizowanej emulacji poradzić sobie z jakimkolwiek opadem.
Mając to na uwadze, nadal istnieją sytuacje, w których warto wiedzieć, z czym się pracuje.
Pakiet „ math / bits ” zawiera rozmiar uint
w bitach. Aby określić wartość maksymalną, przesuń 1
o tyle bitów, minus 1, tj .:(1 << bits.UintSize) - 1
Zwróć uwagę, że podczas obliczania maksymalnej wartości uint
zazwyczaj musisz umieścić ją jawnie w uint
zmiennej (lub większej), w przeciwnym razie kompilator może się nie powieść, ponieważ domyślnie spróbuje przypisać to obliczenie do podpisanej int
(gdzie, jak powinno byłoby oczywiste, nie pasowałoby), więc:
const MaxUint uint = (1 << bits.UintSize) - 1
To jest bezpośrednia odpowiedź na Twoje pytanie, ale istnieje również kilka powiązanych obliczeń, które mogą Cię zainteresować.
Według specyfikacji , uint
i int
zawsze są tej samej wielkości.
uint
32 lub 64 bity
int
taki sam rozmiar jak uint
Więc możemy również użyć tej stałej do określenia maksymalnej wartości int
, biorąc tę samą odpowiedź i dzieląc ją przez 2
odjęcie 1
. to znaczy:(1 << bits.UintSize) / 2 - 1
I minimalna wartość int
, przesuwając 1
o tyle bitów i dzieląc wynik przez -2
. to znaczy:(1 << bits.UintSize) / -2
W podsumowaniu:
MaxUint: (1 << bits.UintSize) - 1
MaxInt: (1 << bits.UintSize) / 2 - 1
MinInt: (1 << bits.UintSize) / -2
pełny przykład (powinien być taki sam jak poniżej)
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
wyodrębniony z golang.org/doc/effective_go.html#printing