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

时间:2014-01-31 22:47:38

标签: go

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

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

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

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

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

5 个答案:

答案 0 :(得分:50)

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将来可能会超过32位,或者在某些系统中会大于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)
}

答案 1 :(得分:23)

  

Package strconv

     

func ParseInt

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

ParseInt解释给定基数(2到36)中的字符串s并返回   相应的值i。如果base == 0,则表示基数   字符串的前缀:“0x”的基数为16,“0”的基数为8,基数为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值。根据{{​​1}},此值将适合bitSizeintint8int16int32。如果值无法由int64给出的有符号整数表示,则为bitSize

  

The Go Programming Language Specification

     

Numeric types

     

n位整数的值是n位宽并使用表示   二进制补码算法。

err.Err = ErrRange
     

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

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 是32位或64位,具体取决于实现。通常,32位编译器为32位,64位编译器为64位。

要查找intint的尺寸,请使用uint

  

Package strconv

     

Constants

strconv.IntSize
     

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)
}

答案 2 :(得分:5)

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

选择

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

至于intint64之间的差异,这取决于架构。 int只是32位或64位整数的别名,具体取决于您要编译的体系结构。

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

答案 3 :(得分:5)

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

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

答案 4 :(得分:0)

在Go lang中,每种类型都被视为单独的数据类型,不能与基本类型互换使用。例如,

type CustomInt64 int64

在上面的声明中,CustomInt64和内置的int64是两个单独的数据类型,不能互换使用。

int,int32和int64的情况相同,所有这些都是单独的数据类型,不能互换使用。其中int32是32的整数类型,int64是64位,并且通用int类型的大小取决于平台。在32位系统上,它的宽度为32位,在64位系统上,它的宽度为64位。因此,在指定通用数据类型(如int,uint和float)时,我们必须小心谨慎。这可能会在代码中的某处引起问题,并使其他平台上的应用程序崩溃。

相关问题