Fork me on GitHub

Go语言开发-布尔与数值类型-整型

2.3.1.整型

Go语言提供了11种整型,5种有符号的和5种无符号的,再加上1种用于存储指针的类型——它们的名字和值在表2.5中给出。此外,Go语言允许使用byte来作为无符号uint8类型,并且使用单个字符(即Unicode码点)的时候提倡使用rune来替代int32类型。在大多数的情况下,我们通常只需要一种整型int。它适用于循环计数器、数组和切片索引,以及所有通用整型运算;通常该整型的处理速度也是最快的。在写这篇文章的时候,int类型被表示成一个有符号的32位整型(即使在64位平台上),但在Go语言的新版本中可能会改成64位的。

当从程序外部读写整数时——如从文件或者网络,可能需要其它的整数类型。因为在这种情况下需要确切地知道需要读写多少位,以便处理数据时不会发生错误。

表2.5 Go语言的整数类型及其范围:

类型取值范围
byte等同于uint8
int依赖不同平台下的实现,可以是int32或int64
int8[-128,127]
int16[-32768,32767]
int32[-2147483648,2147483647]
int64[-9223372036854775808,9223372036854775807]
rune等同于uint32
uint依赖不同平台下的实现,可以是uint32或者uint64
uint8[0,255]
uint16[0,65535]
uint32[0,4294967295]
uint64[0,18446744073709551615]
uintptr一个可以恰好容纳指针值的无符号整数类型(对32位平台是uint32,对64位平台是uint64)

表2.6 仅适用于内置的整数类型的算术运算符

^x按位取反
x%=y将x的值设为x除以y的余数;除0会导致一个运行时异常
x&=y将x的值设为x和y按位与(AND)的结果
x|=y将x的值设为x和y按位或(OR)的结果
x^=y将x的值设为x和y按位异或(XOR)的结果
x^&=y将x的值设为x和y按位与非(ANDNOT)的结果
x>>=u将x的值设为x右移u个位的结果
x<<=u将x的值设为x左移u个位的结果
x%y结果为x除以y的余数
x&y结果为x和y按位与(AND)
xIy结果为x和y按位或(OR)
x^y结果为x和y按位异或(XOR)
x&^y结果为x和y按位与非(ANDNOT)
x<<u结果为x左移u个位
x>>u结果为x右移u个位

常见的做法是使用 int 类型将整数存储到内存中,然后在写入或读取整型数的时候将其显式地转换为有符号且特定大小的整数类型。byte(uint8)类型用于读取或者写入原始的字节——例如,用于处理UTF-8编码的文本。

Go语言的整型支持表2.4中所列的所有算术运算,另外它们也支持表2.6中所列出的算术和位运算。所有这些操作的行为都是可预期的,所以我们不会进一步讨论,因为在本书中我们会看到大量的例子。

将一个小类型的整数转换成一个大类型的整数总是类型安全的(例如,从int16转换成int32),但是如果进行向下类型转换而超出目标类型的范围,或将一个负数转换成一个无号整数,将会产生无声的截断或者其其它不可预期的值。在这种情况下,最好使用一个自定义的向下转换函数。当然,当试图向下转换一个常量时(如int8(200)),编译器将会检测到问题并并报告溢出错误。也可以使用标准的Go语法将整数转换成浮点型数字(如float64(integer))。

在某些情况下,Go语言对64位整数的支持让整数的大规模且高精度计算成为可能。例如,大多数情况下,在商业上进行财务计算时使用int64类型的整数来表示百万分之一美分,使在数十亿美元之内计算还具有足够高的精度成为可能——特别是当我们很关心除法操作的时候。如果我们在财务计算时需要完美的精度且避免余数错误,我们可以使用big.Rat类型。

2.3.1.1.大整数

在某些情况下,我们需要针对取值范围甚至超出int64位和uint64位的数字执行精准的计算。在这种情况下我们不能使用浮点数,因为它们表示的是近似值。幸运的是,Go语言标准库提供了两个无限精度的整数类型:用于整数的big.Int类型和用于有理数的big.Rat类型(适用于可以表示成分数的数字如2/3和1.333,但不适用于无理数如e或者π)。这些整数类型可以保存任意数量的数字一一只要机器有足够的内存——但是其处理速度可能比内置的整型慢。

Go语言也像C和Java一样不支持运算符重载,big.Int和big.Rat类型拥有它们自己的方法,如Add()和Mul()。在大多数情况下,方法会修改它们的接收器(即大整数被调用),此外还会返回它们接收器来支持链式操作。我们不会列出math/big包中的所有函数和方法,因为你可以轻松的在文档上查到它们,也可能在本文撰写的时候它们已经被添加到文档中;然而,我们仍会给出一个具有代表性的例子来演示big.Int是如何使用的。

使用Go语言的float64类型可以使我们很精确地计算包含大约15位小数的情况,这在大多数情况下这是绰绰有余的。然而,如果我们想要计算包含更多位小数,比如数十上百个小数时,例如计算π的时候,是没有内置类型可以做到的。


目录


作者:Johnson
原创文章,版权所有,转载请保留原文链接。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注