정수가 포함 된 문자열이 있습니다 (파일에서 읽음).
나는 변환하기 위해 노력하고있어 string
에 int
사용 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를 제공 하는지 이해하지 못합니다 .
답변
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
향후에 또는 int
C 와 같은 일부 시스템에서 32 비트보다 클 수 있습니다 .
일부 시스템 에서는 해당 시스템이 64 비트 정수로만 작동하기 때문에 int64
더 빠를 수 있습니다 int32
.
다음은 bitSize
8 일 때 오류의 예입니다.
http://play.golang.org/p/_osjMqL6Nj
package main
import (
"fmt"
"strconv"
)
func main() {
i, err := strconv.ParseInt("123456", 10, 8)
fmt.Println(i, err)
}
답변
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
.
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
.
const IntSize = intSize
IntSize
int
또는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
답변
strconv.ParseInt
친구들은 API를 깨끗하고 간단하게 유지하기 위해 64 비트 버전을 반환합니다. 그렇지 않은 경우 가능한 각 반환 유형에 대해 별도의 버전을 만들어야합니다. 또는 return interface{}
, 그러면 유형 어설 션을 거쳐야합니다. 어느 것도 이상적이지 않습니다.
int64
지원되는 64 비트까지의 정수 크기를 포함 할 수 있기 때문에 선택됩니다. 함수에 전달하는 비트 크기는 값이 올바른 범위로 올바르게 고정되었는지 확인합니다. 따라서 반환 된 값에 대해 유형 변환을 수행하여 필요한 정수 유형으로 변환 할 수 있습니다.
의 차이에 관해서 int
와 int64
,이 아키텍처에 의존합니다. int
컴파일하는 아키텍처에 따라 32 비트 또는 64 비트 정수의 별칭입니다.
안목을 위해 : 반환 된 값은 부호있는 정수입니다. strconv.ParseUint
부호없는 정수에 대한 별도의 함수 가 있으며 , uint64
위에서 설명한 것과 동일한 추론 을 반환 하고 따릅니다.
답변
귀하의 목적을 위해 strconv.Atoi()
더 편리하다고 생각합니다.
다른 답변은 int
유형을 설명하는 데 매우 철저 했지만 Go 언어 사양에 대한 링크가 여기에 가치가 있다고 생각합니다. http://golang.org/ref/spec#Numeric_types
답변
Go lang에서 각 유형은 기본 유형과 혼용 할 수없는 별도의 데이터 유형으로 간주됩니다. 예를 들면
type CustomInt64 int64
위의 선언에서 CustomInt64 및 내장 int64는 두 개의 개별 데이터 유형이며 서로 바꿔서 사용할 수 없습니다.
int, int32 및 int64의 경우도 마찬가지입니다. 이들 모두는 서로 바꿔서 사용할 수없는 별도의 데이터 유형입니다. int32가 32 인 경우 정수 유형이고 int64는 64 비트이며 일반 int 유형의 크기는 플랫폼에 따라 다릅니다. 32 비트 시스템에서는 32 비트 폭이고 64 비트 시스템에서는 64 비트 폭입니다. 따라서 int, uint 및 float와 같은 일반 데이터 유형을 지정하는 동안 신중하고 구체적이어야합니다. 코드 어딘가에 문제가 발생할 수 있으며 다른 플랫폼에서 응용 프로그램이 중단됩니다.