Hızlı özet:
import "math/bits"
const (
MaxUint uint = (1 << bits.UintSize) - 1
MaxInt int = (1 << bits.UintSize) / 2 - 1
MinInt int = (1 << bits.UintSize) / -2
)
Arka fon:
Bildiğinizi tahmin ettiğim uint
gibi , bulunduğunuz platforma bağlı olarak tür uint32
veya ile aynı boyutta uint64
. Genellikle, bunların boyutlandırılmamış versiyonu yalnızca maksimum değere yaklaşma riski olmadığında kullanılır, çünkü boyut belirtimi olmayan sürüm, platforma bağlı olarak daha hızlı olma eğiliminde olan "yerel" türü kullanabilir.
Yerel olmayan bir tür kullanmak bazen daha büyük veya daha küçük tamsayıyı taklit etmek için işlemci tarafından gerçekleştirilecek ek matematik ve sınır denetimi gerektirdiğinden "daha hızlı" olma eğiliminde olduğuna dikkat edin. Bunu akılda tutarak, işlemcinin (veya derleyicinin optimize edilmiş kodunun) performansının neredeyse her zaman kendi sınır kontrol kodunuzu eklemekten daha iyi olacağının farkında olun, bu nedenle devreye girme riski varsa, sadece sabit boyutlu sürümü kullanmayı hissedin ve optimize edilmiş öykünmenin bundan kaynaklanan herhangi bir sonucu ele almasına izin verin.
Bununla birlikte, neyle çalıştığınızı bilmenin yararlı olduğu bazı durumlar hala var.
" Math / bit " paketi uint
, bit cinsinden boyutunu içerir . Maksimum değeri belirlemek için, 1
bu kadar bit kadar kaydırın, eksi 1. yani:(1 << bits.UintSize) - 1
Maksimum değerini hesaplarken, uint
genellikle bunu açıkça bir uint
(veya daha büyük) değişkene koymanız gerekeceğini unutmayın ; aksi takdirde derleyici, bu hesaplamayı bir işaretli int
(nerede, olması gerektiği gibi) atamaya çalışacağı için başarısız olabilir. açık olun, uygun olmaz), yani:
const MaxUint uint = (1 << bits.UintSize) - 1
Sorunuzun doğrudan cevabı bu, ancak ilginizi çekebilecek birkaç ilgili hesaplama da var.
Göre spec , uint
ve int
hep aynı boyda.
uint
32 veya 64 bit
int
aynı boyutta uint
Bu sabiti int
, aynı cevabı alıp 2
çıkararak bölerek maksimum değerini belirlemek için de kullanabiliriz 1
. yani:(1 << bits.UintSize) / 2 - 1
Ve minimum değeri, bu kadar bit int
kaydırarak 1
ve sonucu şuna bölerek -2
. yani:(1 << bits.UintSize) / -2
Özetle:
MaxUint: (1 << bits.UintSize) - 1
maxlnt: (1 << bits.UintSize) / 2 - 1
Minint: (1 << bits.UintSize) / -2
tam örnek (aşağıdaki ile aynı olmalıdır)
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