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

新手上路,请多包涵

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

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

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

为什么会这样?我怎样才能得到一个普通的int? (如果有人快速了解何时以及为何我应该使用不同的 int 类型,那就太棒了!)

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

原文由 Isaac Dontje Lindell 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.6k
2 个回答
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 在 C 中。

我想在某些系统上 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)
}

原文由 Shuriken 发布,翻译遵循 CC BY-SA 4.0 许可协议

包 strconv

函数 ParseInt

>  func ParseInt(s string, base int, bitSize int) (i int64, err error)
>
> ```
>
> ParseInt 解释给定基数(2 到 36)中的字符串 s 并返回相应的值 i。如果 base == 0,则字符串的前缀隐含基数:基数 16 代表“0x”,基数 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` 值。 Depending on `bitSize` , this value will fit into `int` , `int8` , `int16` , `int32` , or `int64` 。如果该值不能由 `bitSize` 给出的大小的有符号整数表示,则 `err.Err = ErrRange` 。

> [Go 编程语言规范](http://golang.org/ref/spec)
>
> [数值类型](http://golang.org/ref/spec#Numeric_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)
>
> ```
>
> 还有一组预先声明的数字类型,具有特定于实现的大小:
>
> ```
>  uint     either 32 or 64 bits
> int      same size as uint
>
> ```

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

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

> [包 strconv](http://golang.org/pkg/strconv/)
>
> [常量](http://golang.org/pkg/strconv/#pkg-constants)
>
> ```
> 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

”`

原文由 peterSO 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题