Ringkasan cepat:
import "math/bits"
const (
MaxUint uint = (1 << bits.UintSize) - 1
MaxInt int = (1 << bits.UintSize) / 2 - 1
MinInt int = (1 << bits.UintSize) / -2
)
Latar Belakang:
Seperti yang saya kira Anda tahu, uint
jenisnya adalah ukuran yang sama uint32
atau uint64
, tergantung pada platform Anda. Biasanya, seseorang akan menggunakan versi unsized ini hanya ketika tidak ada risiko mendekati nilai maksimum, karena versi tanpa spesifikasi ukuran dapat menggunakan tipe "asli", tergantung pada platform, yang cenderung lebih cepat.
Perhatikan bahwa itu cenderung "lebih cepat" karena menggunakan tipe non-asli kadang-kadang membutuhkan matematika tambahan dan pemeriksaan batas yang harus dilakukan oleh prosesor, untuk meniru bilangan bulat yang lebih besar atau lebih kecil. Dengan mengingat hal tersebut, ketahuilah bahwa kinerja prosesor (atau kode yang dioptimalkan kompiler) hampir selalu akan lebih baik daripada menambahkan kode pemeriksaan batas Anda sendiri, jadi jika ada risiko prosesor ikut bermain, itu mungkin membuat akal untuk hanya menggunakan versi ukuran tetap, dan biarkan emulasi yang dioptimalkan menangani dampak dari itu.
Dengan itu, masih ada beberapa situasi di mana berguna untuk mengetahui apa yang Anda kerjakan.
Paket " math / bits " berisi ukuran uint
, dalam bits. Untuk menentukan nilai maksimum, bergeser 1
dengan banyak bit itu, minus 1. yaitu:(1 << bits.UintSize) - 1
Perhatikan bahwa ketika menghitung nilai maksimum uint
, Anda biasanya harus memasukkannya secara eksplisit ke dalam uint
variabel (atau lebih besar), jika tidak kompiler akan gagal, karena akan gagal untuk menetapkan penetapan perhitungan ke dalam tanda tangan int
(di mana, sebagaimana seharusnya menjadi jelas, itu tidak akan cocok), jadi:
const MaxUint uint = (1 << bits.UintSize) - 1
Itulah jawaban langsung untuk pertanyaan Anda, tetapi ada juga beberapa perhitungan terkait yang mungkin menarik bagi Anda.
Menurut spesifikasi , uint
danint
ukurannya selalu sama.
uint
baik 32 atau 64 bit
int
ukuran yang sama dengan uint
Jadi kita juga dapat menggunakan konstanta ini untuk menentukan nilai maksimum int
, dengan mengambil jawaban yang sama dan membaginya dengan 2
kemudian mengurangi 1
. yaitu:(1 << bits.UintSize) / 2 - 1
Dan nilai minimum int
, dengan menggeser 1
banyak bit dan membagi hasilnya dengan -2
. yaitu:(1 << bits.UintSize) / -2
Singkatnya:
MaxUint: (1 << bits.UintSize) - 1
Maksimal: (1 << bits.UintSize) / 2 - 1
MinInt: (1 << bits.UintSize) / -2
contoh lengkap (harus sama dengan di bawah ini)
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
diekstrak dari golang.org/doc/effective_go.html#printing