>  기사  >  백엔드 개발  >  Go에서 Int의 최대값을 분석한 기사

Go에서 Int의 최대값을 분석한 기사

藏色散人
藏色散人앞으로
2021-11-15 15:35:214704검색

이 글은 Go에서 Int의 최대값을 소개하는 go 언어튜토리얼 칼럼에서 소개한 글이 도움이 필요한 친구들에게 도움이 되길 바랍니다!

요약:

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와 크기가 동일하다는 것을 알고 계실 것 같습니다. code> , 플랫폼에 따라 다릅니다. 일반적으로 크기 없는 버전은 플랫폼에 따라 달라지는 "네이티브" 유형을 사용할 수 있고 더 빠른 경향이 있으므로 최대값에 가까워질 위험이 없는 경우에만 사용됩니다. <code>uint类型的大小与uint32uint64相同,具体取决于您所在的平台。通常,只有在没有接近最大值风险的情况下,才会使用无尺寸的版本,因为没有尺寸规格的版本可以使用“本机”类型,这取决于平台,并且它往往更快。

请注意,更 “快” 是因为使用非本机类型需要处理器执行额外的数学计算和边界检查,以便模拟更大或更小的整数。因此,处理器(或编译器的优化代码)性能会比添加边界检查的代码要好。

话虽如此,在某些情况下,了解您正在使用的内容仍然很有用。

“math/bits“ 包中含有以字节为单位的uint大小(译者注:UintSize )。要确定最大值,将 1 左移许多位,再减去 1。即:(1 << bits.UintSize) - 1

请注意,在计算 uint 的最大值时,您通常需要将其显式放入一个 uint(或更大的类型)类型变量中,否则编译器可能会失败,因为它会默认尝试将该计算分配给一个有符号int(很明显,它不适合),所以:

const MaxUint uint = (1 << bits.UintSize) - 1

这是您问题的直接答案,但您可能对一些相关的计算感兴趣。

根据 spec,uintint 的大小始终相同。

uint 32 位或 64 位

intuint 大小相同

因此,我们也可以使用这个常量来确定 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

"더 빠르다"는 것은 기본이 아닌 유형을 사용하려면 더 크거나 작은 정수를 시뮬레이션하기 위해 프로세서가 추가 수학 및 경계 검사를 수행해야 하기 때문입니다. 따라서 프로세서(또는 컴파일러의 최적화된 코드)는 범위 검사를 추가하는 코드보다 더 나은 성능을 발휘합니다.

그래도 현재 작업 중인 내용을 아는 것이 유용한 상황이 여전히 있습니다.

"math/bits" 패키지에는 uint 크기(바이트)가 포함되어 있습니다(번역자 참고: UintSize). 최대값을 결정하려면 1을 여러 자리만큼 왼쪽으로 이동하고 1을 뺍니다. 즉, (1 << bit.UintSize) - 1
uint의 최대값을 계산할 때 일반적으로 명시적으로 입력해야 한다는 점에 유의하세요. 그렇지 않으면 기본적으로 계산을 서명된 int에 할당하려고 시도하기 때문에 컴파일러가 실패할 수 있습니다(분명히 그렇지 않습니다). 맞지 않음), 따라서:

package mainimport (
    "fmt"
    "math"
    "math/bits"
    "runtime"
    "strconv")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)

    fmt.Println("MaxUint:", uint(math.MaxUint))
    fmt.Println("MinInt:", math.MinInt)
    fmt.Println("MaxInt:", math.MaxInt)

    fmt.Println("系统架构:", runtime.Compiler, runtime.GOARCH, runtime.GOOS)
    fmt.Println("Int 大小:", strconv.IntSize)}
이것은 귀하의 질문에 대한 직접적인 답변이지만 일부 관련 계산에 관심이 있을 수도 있습니다.

사양에 따르면 uintint는 항상 같은 크기입니다.
🎜🎜uint🎜 32비트 또는 64비트 🎜🎜🎜int🎜 uint와 동일한 크기🎜🎜🎜그래서, 우리는 또한 이 상수를 사용하여 동일한 답을 2로 나눈 다음 1을 빼서 int의 최대값을 결정할 수 있습니다. 즉, (1 🎜🎜 및 <code>1을 이동하여 int의 최소값입니다. 그 만큼의 숫자를 입력하고 결과를 -2로 나눕니다. 즉: (1 << 비트.UintSize) / -2🎜🎜간략히: 🎜🎜** MaxUint: ** (1 << 비트.UintSize) - 1🎜🎜** MaxInt: ** <code>(1 << 비트.UintSize) / 2 - 1🎜🎜** MinInt: ** (1 <&lt ; 비트 .UintSize) / -2🎜🎜전체 예(아래 이미지와 동일해야 함): 🎜
MinInt32: -2147483648
 MaxInt32:  2147483647MaxUint32:  4294967295
 MinInt64: -9223372036854775808
 MaxInt64:  9223372036854775807MaxUint64:  18446744073709551615
  MaxUint:  18446744073709551615
   MinInt: -9223372036854775808
   MaxInt:  9223372036854775807MaxUint: 18446744073709551615MinInt: -9223372036854775808MaxInt: 9223372036854775807系统架构: gc amd64 darwin
Int 大小: 64
🎜출력: 🎜rrreee🎜🎜🎜원본 주소: https://stackoverflow.com/questions/ 6878...🎜 🎜번역 주소 : https://learnku.com/go/t/62359🎜🎜

위 내용은 Go에서 Int의 최대값을 분석한 기사의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 learnku.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제