Go中的int和int64有什么区别?

Isa*_*ell 75 go

我有一个包含整数的字符串(已从文件中读取).

我正在尝试将其转换stringint使用strconv.ParseInt(). ParseInt要求我提供一个bitsize(位大小0,8,16,32和64对应于int,int8,int16,int32和int64).

从文件读取的整数很小(即它应该适合普通的int).但是,如果我传递0的bitsize,我会得到类型的结果int64(可能是因为我在64位操作系统上运行).

为什么会这样?我如何获得正常的int?(如果有人对何时以及为什么我应该使用不同的int类型进行快速入门,那就太棒了!)

编辑:我可以使用将int64转换为普通的int int([i64_var]).但我仍然不明白为什么ParseInt()在我请求0的位数时给我一个int64.

Shu*_*ken 52

func ParseInt(s string, base int, bitSize int) (i int64, err error)
Run Code Online (Sandbox Code Playgroud)

ParseInt总是返回 int64

bitSize定义值的范围.如果对应于s的值不能用给定大小的有符号整数表示,则err.Err = ErrRange.

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

type int int
Run Code Online (Sandbox Code Playgroud)

int是有符号整数类型,其大小至少为32位.但是,它是一种不同的类型,而不是int32的别名.

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

因此int将来可能会超过32位,或者像intC中的某些系统那样大于32位.

我想在一些系统上int64可能比int32因为该系统仅适用于64位整数更快.

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)
}
Run Code Online (Sandbox Code Playgroud)

  • 在实践中,Go通常在amd64 GOARCH上使用`int64`表示`int`,在32位GOARCHes上使用`int32`表示`int`.至少使用默认编译器,我不确定gccgo.所以"`int`可能大于32位......"不仅仅是猜测,实际上很可能因为64位编译目标通常被认为是Go中的主要分支. (20认同)
  • "在实践中,Go**通常**在amd64 [..]上使用int64 for int - 更准确地说,**int总是等于处理器位大小**.所以在64位系统上,它是64位,在32位系统上,它是32位.我喜欢认为它是int32或int64的别名,具体取决于你的编译目标(即使它没有作为别名实现,也无关紧要). (10认同)
  • @zupa“int 始终等于处理器位大小”的来源/参考是什么? (3认同)

pet*_*rSO 25

包strconv

func ParseInt

func ParseInt(s string, base int, bitSize int) (i int64, err error)
Run Code Online (Sandbox Code Playgroud)

ParseInt解释给定基数(2到36)中的字符串s并返回相应的值i.如果base == 0,则字符串的前缀暗示基数:base 16表示"0x",base 8表示"0",否则表示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位宽,并使用二进制补码算法表示.

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)
Run Code Online (Sandbox Code Playgroud)

还有一组具有特定于实现的大小的预先声明的数字类型:

uint     either 32 or 64 bits
int      same size as uint
Run Code Online (Sandbox Code Playgroud)

int取决于实现,是32位或64位.通常,对于32位编译器,它是32位,对于64位编译器,它是64位.

要找出int或的大小uint,请使用strconv.IntSize.

包strconv

常量

const IntSize = intSize
Run Code Online (Sandbox Code Playgroud)

IntSize是a intuintvalue的位大小.

例如,

package main

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

func main() {
    fmt.Println(runtime.Compiler, runtime.GOARCH, runtime.GOOS)
    fmt.Println(strconv.IntSize)
}
Run Code Online (Sandbox Code Playgroud)

输出:

gc amd64 linux
64
Run Code Online (Sandbox Code Playgroud)


jim*_*imt 5

strconv.ParseInt和朋友返回64位版本,以保持API干净简单.否则,必须为每种可能的返回类型创建单独的版本.或者返回interface{},然后必须通过类型断言.这些都不是理想的.

int64选择,因为它可以保持任何整数大小,包括支持的64位.传递给函数的位大小可确保将值正确钳位到正确的范围.因此,您只需对返回的值执行类型转换,即可将其转换为所需的任何整数类型.

至于int和之间的区别int64,这取决于架构.int它只是32位或64位整数的别名,具体取决于您要编译的体系结构.

对于挑剔的眼睛:返回的值是有符号整数.strconv.ParseUint对于无符号整数,有一个单独的函数,它返回uint64并遵循与上述相同的推理.

  • 从我到目前为止所看到的,这几乎是正确的,除了我不认为`int`只是一个别名 - 它实际上是一个独特的类型.http://golang.org/pkg/builtin/#int (4认同)

Mat*_*att 5

为了您的目的,strconv.Atoi()我认为会更方便.

其他答案对于解释int类型非常详尽,但我认为这里有一个Go语言规范的链接:http://golang.org/ref/spec#Numeric_types