Go和int64有什么不同?

我有一个string包含一个整数(已从文件中读取)。

我想使用strconv.ParseInt()string转换为一个intParseInt要求我提供bitsize(位大小0,8,16,32和64对应于int,int8,int16,int32和int64)。

从文件读取的整数很小(即它应该适合一个正常的int)。 如果我传递一个0的比特,但是,我得到了一个int64types的结果(大概是因为我在64位操作系统上运行)。

为什么发生这种情况? 我怎么才能得到一个正常的int? (如果有人快速入门,何时以及为什么我应该使用不同的inttypes,那太棒了!)

编辑:我可以使用int([i64_var])将int64转换为正常的int。 但我仍然不明白为什么ParseInt()给我一个int64时,我要求的比特大小为0。

 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是一个至less有32位大小的有符号整数types。 这是一个独特的types,但是,不是int32的别名。

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

所以int将来可能会比32位更大,或者像C中的int这样的系统。

我猜在一些系统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) } 

包strconv

func ParseInt

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

ParseInt解释给定基础(2到36)中的strings并返回相应的值i。 如果base == 0,则基数由string的前缀隐含:base 16代表“0x”,base 8代表“0”,否则以10为底数。

bitSize参数指定结果必须适合的整数types。 位大小0,8,16,32和64对应于int,int8,int16,int32和int64。

ParseInt返回的错误具有具体types* NumError,并且包含err.Num = s。 如果s为空或包含无效数字,则err.Err = ErrSyntax; 如果与s对应的值不能用给定大小的有符号整数表示,则err.Err = ErrRange。

ParseInt总是返回一个int64值。 取决于bitSize ,该值将适合intint8int16int32int64 。 如果该值不能由bitSize给定大小的有符号整数表示,则err.Err = ErrRange

Go编程语言规范

数字types

一个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) 

还有一组具有实现特定大小的预定义数字types:

 uint either 32 or 64 bits int same size as uint 

int是32或64位,具体取决于实现。 通常32位编译器为32位,64位编译器为64位。

要找出intuint的大小,请使用strconv.IntSize

包strconv

常量

 const IntSize = intSize 

IntSizeintuint值的大小。

例如,

 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和朋友返回64位版本,以保持API清洁和简单。 否则,人们将不得不为每个可能的返回types创build单独的版本。 或者返回interface{} ,然后必须经过一个types断言。 没有一个是理想的。

int64被选中,因为它可以保持任何整数大小,包括支持的64位。 您传入函数的位大小确保将值正确地钳位到正确的范围。 所以你可以简单地对返回的值进行types转换,把它转换成你需要的任何整数types。

至于intint64之间的区别,这是依赖于体系结构的。 int只是32位或64位整数的别名,具体取决于您正在编译的架构。

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

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

其他答案已经非常详尽地解释inttypes,但我认为这里有一个指向Go语言规范的链接: http : //golang.org/ref/spec#Numeric_types