Go 语言中的整数

Note

本文摘录自《Go语言趣学指南》第 7 章, 请访问 gpwgcn.com 以获取更多相关信息。

../_images/gpwgcn1.jpg

Go 提供了 10 种类型用于表示整数, 它们被统称为整数类型(integer)。 整数类型不能存储分数, 也不会出现浮点类型的精度问题, 但因为每种整数类型的取值范围都各不相同, 所以我们应该根据场景所需的取值范围来决定使用何种整数类型。

在 Go 提供的众多整数类型当中, 有 5 种整数类型是有符号(signed)的, 这意味着它们既可以表示正整数, 又可以表示负整数。 在这些整数类型中, 最常用的莫过于代表有符号整数的 int 类型了:

../_images/figure_7_1_1.png
var year int = 2018

除有符号整数之外, Go 还提供了 5 种只能表示正整数的无符号(unsigned)整数类型, 其中的典型为 uint 类型:

var month uint = 2

因为 Go 在进行类型推断的时候总是会选择 int 类型作为整数值的类型, 所以下面这 3 行代码的意义是完全相同的:

year := 2018
var year = 2018
var year int = 2018

为不同场合而设的整数类型

无论是有符号整数还是无符号整数, 它们都有各种不同大小(size)的类型可供选择, 而不同大小又会影响它们自身的取值范围以及内存占用。 表 7-1 列出了 8 种与计算机架构无关的整数类型, 以及这些类型需要占用的内存大小。


表 7-1 与计算机架构无关的整数类型

../_images/table_7_1.png

正如表 7-1 所示, Go 提供了非常多的整数类型可供选择。 本章稍后将会介绍其中一些类型的应用场景, 并说明当程序超出类型的有效取值范围时会发生什么事情。

因为 int 类型和 uint 类型会根据目标硬件选择最合适的位长, 所以它们未被包含在 表 7-1 里面。 举个例子, 在诸如 Go Playground、Raspberry Pi 2 和旧款手机等 32 位架构上, intuint 都是 32 位值, 而较新的计算机都基于 64 位架构, 所以这些架构上的 intuint 都是 64 位值。