Go 语言里的整数类型
- Go 提供了 10 种整数类型:
- 不可以存小数部分
- 范围有限
- 通常根据数值范围来选取整数类型
- 5 种整数类型是有符号的
- 5 种整数类型是无符号的
- 最常用的整数类型是 int
8 种整数类型
- 整数类型,包括有符号和无符号的,实际上一共是 8 种类型:
int 和 uint
- 而 int 和 uint 是针对目标设备优化的类型:
- 在树莓派 2、比较老的移动设备上,int 和 uint 都是 32 位的。
- 在比较新的计算机上,int 和 uint 都是 64 位的。
- Tip:
- 如果你在较老的 32 位设备上,使用了超过 20 亿的整数,并且代码还能运行,那么最好使用 int64 和 uint64 来代替 int 和 uint
- 虽然在某些设备上 int 可以看作是 int32,在某些设备上 int 可以看作是 int64,但它们其实是 3 种不同的类型。
- int 并不是其它类型的别名
- unit同理
打印数据类型
- 在 Printf 里使用 %T 就可以打印出数据的类型。
uint8
- uint8 可以用来表示 8 位的颜色(红绿蓝:0-255)。
- 为什么不使用 int ?
- uint8 的取值范围正好合适,而 int 则多出来几十亿不合理的数。
- 如果很多颜色数据连续存储,例如未被压缩的图片,那么使用uint8 可以节省很多内存。
十六进制表示法
- Go 语言里,在数前面加上 0x 前缀,就可以用十六进制的形式来表示数值。
打印十六进制
整数环绕
- 所有的整数类型都有一个取值范围,超出这个范围,就会发生“环绕
打印每个 bit
整数类型的最大、最小值
- math 包里,为与架构无关的整数类型,定义了最大、最小值常量:
- 而 int 和 uint,可能是 32 或 64 位的。
如何避免时间发生环绕
- Unix 系统里,时间是以 1970 年 1 月 1 日至今的秒数来表示的。
- 但是在 2038 年,这个数就会超过 20 多亿,也就是超过了 int32 的范围。
- 应使用:int64 或 uint64
作业题
- 编写一个新的存钱罐程序,它使用整数来跟踪美分而不是美元的数量:
- 随机将五分镍币(5美分)、一角硬币(10美分)和25美分硬币(25美分)放入一个空的储蓄罐,直到里面至少有20美元。
- 以美元显示每次存款后存钱罐的余额(例如$1.05)。
package main
import (
"fmt"
"math/rand"
)
func main() {
piggyBank := 0
for piggyBank <= 2000 {
switch rand.Intn(3) {
case 0:
piggyBank += 5
case 1:
piggyBank += 10
case 2:
piggyBank += 25
}
dollars := piggyBank / 100
cents := piggyBank % 100
fmt.Printf("$%d.%02d\n", dollars, cents)
}
}