Go 语言里的整数类型

  • Go 提供了 10 种整数类型:
    • 不可以存小数部分
    • 范围有限
    • 通常根据数值范围来选取整数类型
  • 5 种整数类型是有符号的
    • 能表示正数、0、负数
  • 5 种整数类型是无符号的
    • 能表示正数、0
  • 最常用的整数类型是 int

整数 - 图1

  • 无符号整数类型是 uint

整数 - 图2

  • 使用类型推断
  • 下面三个语句是等价的

整数 - 图3

8 种整数类型

  • 整数类型,包括有符号和无符号的,实际上一共是 8 种类型:
    • 他们的取值范围各不相同。
    • 与架构无关

整数 - 图4

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

整数 - 图5

  • 为什么不使用 int ?
    • uint8 的取值范围正好合适,而 int 则多出来几十亿不合理的数。
    • 如果很多颜色数据连续存储,例如未被压缩的图片,那么使用uint8 可以节省很多内存。

十六进制表示法

  • Go 语言里,在数前面加上 0x 前缀,就可以用十六进制的形式来表示数值。

整数 - 图6

打印十六进制

  • 打印十六进制的数,使用 %x 格式化动词

整数 - 图7

  • 也可以指定最小宽度和填充:

整数 - 图8

整数 - 图9

整数环绕

  • 所有的整数类型都有一个取值范围,超出这个范围,就会发生“环绕

整数 - 图10

整数 - 图11

打印每个 bit

  • 使用 %b 格式化动词

整数 - 图12

整数 - 图13

  • 为什么会发生整数环绕?

整数 - 图14

整数 - 图15

整数类型的最大、最小值

  • math 包里,为与架构无关的整数类型,定义了最大、最小值常量:

整数 - 图16

  • 而 int 和 uint,可能是 32 或 64 位的。

如何避免时间发生环绕

  • Unix 系统里,时间是以 1970 年 1 月 1 日至今的秒数来表示的。
  • 但是在 2038 年,这个数就会超过 20 多亿,也就是超过了 int32 的范围。
  • 应使用:int64 或 uint64

作业题

  • 编写一个新的存钱罐程序,它使用整数来跟踪美分而不是美元的数量:
    • 随机将五分镍币(5美分)、一角硬币(10美分)和25美分硬币(25美分)放入一个空的储蓄罐,直到里面至少有20美元。
    • 以美元显示每次存款后存钱罐的余额(例如$1.05)。
  1. package main
  2. import (
  3. "fmt"
  4. "math/rand"
  5. )
  6. func main() {
  7. piggyBank := 0
  8. for piggyBank <= 2000 {
  9. switch rand.Intn(3) {
  10. case 0:
  11. piggyBank += 5
  12. case 1:
  13. piggyBank += 10
  14. case 2:
  15. piggyBank += 25
  16. }
  17. dollars := piggyBank / 100
  18. cents := piggyBank % 100
  19. fmt.Printf("$%d.%02d\n", dollars, cents)
  20. }
  21. }