Go에서 int와 int64의 차이점은 무엇입니까?


86

정수가 포함 된 문자열이 있습니다 (파일에서 읽음).

나는 변환하기 위해 노력하고있어 stringint사용 strconv.ParseInt(). ParseInt비트 크기를 제공해야합니다 (비트 크기 0, 8, 16, 32 및 64는 int, int8, int16, int32 및 int64에 해당).

파일에서 읽은 정수는 작습니다 (즉, 일반 정수에 맞아야합니다). 그러나 비트 크기 0을 전달하면 유형의 결과가 표시됩니다 int64(아마도 64 비트 OS에서 실행 중이기 때문일 것입니다).

왜 이런 일이 발생합니까? 일반 정수를 어떻게 얻습니까? (누군가 내가 다른 int 유형을 사용해야하는시기와 이유에 대한 빠른 입문서를 가지고 있다면 그것은 멋질 것입니다!)

편집 : .NET을 사용하여 int64를 일반 int로 변환 할 수 있습니다 int([i64_var]). 그러나 나는 여전히 ParseInt()비트 크기 0을 요청할 때 왜 int64를 제공 하는지 이해하지 못합니다 .


2
간결함을 위해 Atoi 를 사용 하시겠습니까 ? 또한 ParseInt 함수가 오류를 반환합니까?
Matt

2
좋아요, 이제 조금 혼란 스러워요. Atoi ()를 사용하면 int가 주어지고 모든 것이 작동합니다. 나는 parseInt(s, 0, 0)(문자열에 기본 접두사가 없기 때문에) base10을 추론 해야하는 을 호출했습니다 . 그러나 Atoi는 parseInt10의 밑수를 사용하여 호출하는 약어 입니다. base 매개 변수가 반환되는 유형에 차이를 만드는 이유는 무엇입니까?
Isaac Dontje Lindell

기본 매개 변수는 입력 문자열을 읽는 방법을 결정합니다. 문자열은 "123"또는 "0xBEEFCAKE"또는 "1011101"또는 "0677"과 같은 형태 일 수 있습니다. 모두 다른 의미를 가지며 다른 숫자 값을 생성합니다. 기본 값은 0코드가 자체적으로이를 파악하려고 시도 함 을 의미합니다. 그러나 때로는 이것이 불가능합니다. 11(십진수) 대 11(이진)은 완전히 다른 값을 나타냅니다.
jimt

1
좋아, 내가 정말로 혼란스러워하는 것은 문서 인 것 같다. Atoi의 문서는 단지 ""의 속기 일 뿐이라고 말합니다 parseInt(s, 10, 0). 그런데 왜 Atoi가 int64를 반환 int하는 동안 parseInt반환됩니까?
Isaac Dontje Lindell

1
이유를 정확히 알지 못 Atoi하기 때문에 C API에 더 익숙한 사람들을 수용하기 위해 추가 된 것으로 간주합니다 .int atoi ( const char * str );
jimt

답변:


56
func ParseInt(s string, base int, bitSize int) (i int64, err error)

ParseInt는 항상 int64

bitSize값의 범위를 정의합니다. s에 해당하는 값을 지정된 크기의 부호있는 정수로 나타낼 수없는 경우 err.Err = ErrRange입니다.

http://golang.org/pkg/strconv/#ParseInt

type int int

int는 크기가 32 비트 이상인 부호있는 정수 유형입니다. 그러나 이것은 고유 한 유형이며 int32와 같은 별칭이 아닙니다.

http://golang.org/pkg/builtin/#int

따라서 int향후에 또는 intC 와 같은 일부 시스템에서 32 비트보다 클 수 있습니다 .

일부 시스템 에서는 해당 시스템이 64 비트 정수로만 작동하기 때문에 int64더 빠를 수 있습니다 int32.

다음은 bitSize8 일 때 오류의 예입니다.

http://play.golang.org/p/_osjMqL6Nj

package main

import (
    "fmt"
    "strconv"
)

func main() {
    i, err := strconv.ParseInt("123456", 10, 8)
    fmt.Println(i, err)
}

22
실제로, 이동은 일반적으로 사용 int64에 대한 intAMD64의 GOARCH에와 int32대한 int32 비트 GOARCHes합니다. 적어도 기본 컴파일러에서는 gccgo에 대해 잘 모르겠습니다. 따라서 " int32 비트보다 클 수 있습니다 ..."는 단순한 추측이 아니라 64 비트 컴파일 대상이 일반적으로 Go의 주요 분기로 간주되기 때문에 실제로 가능성이 높습니다.
LinearZoetrope

12
"실제로 Go는 일반적으로 amd64 [..]의 int에 int64를 사용합니다."-보다 정확하게는 int는 항상 프로세서 비트 크기와 같습니다 . 따라서 64 비트 시스템에서는 64 비트이고 32 비트 시스템에서는 32 비트입니다. 컴파일 대상에 따라 int32 또는 int64의 별칭이라고 생각하고 싶습니다 (별칭으로 구현되지 않더라도 중요하지 않습니다).
zupa 2015

@zupa "int가 항상 프로세서 비트 크기와 같음"에 대한 소스 / 참조는 무엇입니까?
kapad

29

패키지 strconv

func ParseInt

func ParseInt(s string, base int, bitSize int) (i int64, err error)

ParseInt는 주어진 밑수 (2 ~ 36)의 문자열 s를 해석하고 해당 값 i를 반환합니다. base == 0이면 base는 문자열의 접두사로 내포됩니다. "0x"의 경우 base 16, "0"의 경우 base 8, 그렇지 않으면 base 10입니다.

bitSize 인수는 결과가 맞아야하는 정수 유형을 지정합니다. 비트 크기 0, 8, 16, 32 및 64는 int, int8, int16, int32 및 int64에 해당합니다.

ParseInt가 반환하는 오류는 구체적인 유형 * NumError를 가지며 err.Num = s를 포함합니다. s가 비어 있거나 유효하지 않은 숫자를 포함하는 경우 err.Err = ErrSyntax; s에 해당하는 값을 주어진 크기의 부호있는 정수로 나타낼 수없는 경우 err.Err = ErrRange입니다.

ParseInt항상 int64값을 반환합니다 . 에 따라 bitSize,이 값에 맞는 int, int8, int16, int32, 또는 int64. 값에 의해 주어진 크기의 부호있는 정수로 표현 할 수없는 경우 bitSize다음 err.Err = ErrRange.

Go 프로그래밍 언어 사양

숫자 유형

n 비트 정수의 값은 n 비트 폭이며 2의 보수 산술을 사용하여 표현됩니다.

int8        the set of all signed  8-bit integers (-128 to 127)
int16       the set of all signed 16-bit integers (-32768 to 32767)
int32       the set of all signed 32-bit integers (-2147483648 to 2147483647)
int64       the set of all signed 64-bit integers (-9223372036854775808 to 9223372036854775807)

구현 별 크기가있는 사전 선언 된 숫자 유형 세트도 있습니다.

uint     either 32 or 64 bits
int      same size as uint

int구현에 따라 32 비트 또는 64 비트입니다. 일반적으로 32 비트 컴파일러의 경우 32 비트이고 64 비트 컴파일러의 경우 64 비트입니다.

int또는 의 크기를 확인하려면을 uint사용하십시오 strconv.IntSize.

패키지 strconv

상수

const IntSize = intSize

IntSizeint또는 uint값의 비트 단위 크기입니다 .

예를 들면

package main

import (
    "fmt"
    "runtime"
    "strconv"
)

func main() {
    fmt.Println(runtime.Compiler, runtime.GOARCH, runtime.GOOS)
    fmt.Println(strconv.IntSize)
}

산출:

gc amd64 linux
64

7

strconv.ParseInt친구들은 API를 깨끗하고 간단하게 유지하기 위해 64 비트 버전을 반환합니다. 그렇지 않은 경우 가능한 각 반환 유형에 대해 별도의 버전을 만들어야합니다. 또는 return interface{}, 그러면 유형 어설 션을 거쳐야합니다. 어느 것도 이상적이지 않습니다.

int64지원되는 64 비트까지의 정수 크기를 포함 할 수 있기 때문에 선택됩니다. 함수에 전달하는 비트 크기는 값이 올바른 범위로 올바르게 고정되었는지 확인합니다. 따라서 반환 된 값에 대해 유형 변환을 수행하여 필요한 정수 유형으로 변환 할 수 있습니다.

의 차이에 관해서 intint64,이 아키텍처에 의존합니다. int컴파일하는 아키텍처에 따라 32 비트 또는 64 비트 정수의 별칭입니다.

안목을 위해 : 반환 된 값은 부호있는 정수입니다. strconv.ParseUint부호없는 정수에 대한 별도의 함수 가 있으며 , uint64위에서 설명한 것과 동일한 추론 을 반환 하고 따릅니다.


4
내가 지금까지 본 것에서 이것은 거의 정확합니다. 단, int단순히 별칭 이라고 생각하지 않는다는 점을 제외하면 실제로는 별개의 유형입니다. golang.org/pkg/builtin/#int
Isaac Dontje Lindell

과연. Go는 실제로 유형 앨리어싱을 수행하지 않습니다. 이와 같은 type int int32것은 고유하고 별도의 유형으로 취급됩니다. 특히 int새로운 메서드를 적용 하여 유형에 대해 새로운 기능을 정의 할 수 있기 때문 입니다.
jimt


0

Go lang에서 각 유형은 기본 유형과 혼용 할 수없는 별도의 데이터 유형으로 간주됩니다. 예를 들면

type CustomInt64 int64

위의 선언에서 CustomInt64 및 내장 int64는 두 개의 개별 데이터 유형이며 서로 바꿔서 사용할 수 없습니다.

int, int32 및 int64의 경우도 마찬가지입니다. 이들 모두는 서로 바꿔서 사용할 수없는 별도의 데이터 유형입니다. int32가 32 인 경우 정수 유형이고 int64는 64 비트이며 일반 int 유형의 크기는 플랫폼에 따라 다릅니다. 32 비트 시스템에서는 32 비트 폭이고 64 비트 시스템에서는 64 비트 폭입니다. 따라서 int, uint 및 float와 같은 일반 데이터 유형을 지정하는 동안 신중하고 구체적이어야합니다. 코드 어딘가에 문제가 발생할 수 있으며 다른 플랫폼에서 응용 프로그램이 중단됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.