빠른 요약 :
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을 뺀 비트 만큼 이동 하십시오.(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