Швидкий підсумок:
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, залежно від платформи, на якій ви знаходитесь. Зазвичай можна використовувати нерозмірну версію цих версій лише тоді, коли немає ризику наблизитись до максимального значення, оскільки версія без специфікації розміру може використовувати "нативний" тип, залежно від платформи, яка, як правило, швидша.
Зауважте, що це, як правило, "швидше", тому що використання нетипового типу іноді вимагає додаткової математики та перевірки меж, яку повинен виконувати процесор, щоб імітувати більший чи менший ціле число. Зважаючи на це, майте на увазі, що продуктивність процесора (або оптимізованого коду компілятора) майже завжди буде кращою, ніж додавання власного коду перевірки меж, тому, якщо є якийсь ризик його вступу, він може створити сенс просто використовувати версію фіксованого розміру, і дозволити оптимізованій емуляції обробляти будь-які випадання з цього.
Зважаючи на це, є ще деякі ситуації, коли корисно знати, з чим ти працюєш.
Пакет " математика / біт " містить розмір 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