数字字面量

Nim 中的数字字面量和大多数其他语言一样。为了增加可读性,可以在数字字面量中插入下划线(注意,不可以连续插入下划线),比如:

  1. echo 1_0000 == 10000 # 输出 true
  2. echo 1_000_0 == 10000 # 输出 true
  3. echo 1_000_____0 == 10000 # 编译时错误

带有 e 或者 E 的数字表示一个使用科学计数法的浮点数。比如 1.0e9 表示 数字 - 图1

数字的十六进制表示以 0x 开头;二进制表示以 0b 开头;八进制表示以 0o 开头。

数字类型

数字类型有两种:整数和浮点数。

整数

整数类型有有符号整数 intint8int16int32int64 和无符号整数 uintuint8uint16uint32uint64

在声明一个整数变量时,如果不指定类型,则默认是 int。比如:

  1. var a = 1
  2. echo typeof a # 输出 int
  3. var b: int64 = 2
  4. echo typeof b # 输出 int64

还可以使用类型后缀来指定整数类型。比如:

  1. var c = 3'i8
  2. echo typeof c # 输出 int8
  3. var d = 4'u
  4. echo typeof d # 输出 uint
  5. var e = 5'u16
  6. echo typeof e # 输出 uint16

int 变量占用内存的大小和指针一样。

整数运算

算术运算

整数支持基本的算数运算:

  1. echo 3 + 4 # 7
  2. echo 3 - 4 # -1
  3. echo 3 * 4 # 12
  4. echo 3 / 4 # 0.75
  5. echo 3 div 4 # 0
  6. echo 7 div 4 # 1
  7. echo 4 mod 3 # 1
  8. echo -1 mod 3 # -1

比较运算

整数支持比较运算符:

  1. echo 3 >= 4 # false
  2. echo 3 > 4 # false
  3. echo 3 == 4 # false
  4. echo 3 < 4 # true
  5. echo 3 <= 4 # true
  6. echo 3 != 4 # true

位运算

整数支持位运算。其中,

  • and 表示按位与
  • or 表示按位或
  • xor 表示按位异或
  • not 表示按位取反(非)
  • shl 表示向左位移(shift left)
  • shr 表示向右位移(shift right)

二进制运算在操作整数时,总是把整数看做无符号整数。

  1. echo 5 and 6 # 101 and 110 => 100 => 4
  2. echo 5 or 6 # 101 or 110 => 111 => 7
  3. echo 5 xor 6 # 101 xor 110 => 011 => 3
  4. echo not 15'u8 # not 00001111 => 11110000 => 11111111 - 00001111 => 255 - 15 => 240
  5. echo 1 shl 2 # 001 << 2 => 100 => 4
  6. echo 4 shr 2 # 100 >> 2 => 001 => 1

浮点数

浮点数类型有 floatfloat32float64

  • 默认使用 float(官方文档说默认是 float,但是实际上执行代码时,发现默认是 float64
  • 在当前实现中,float 总是 64 位(float64
  • 浮点数字面量也支持类型后缀

比如:

  1. var w = 1.414
  2. echo typeof w # 输出 float64
  3. var x: float = 1.732
  4. echo typeof x # 输出 float
  5. var y: float64 = 2.17828
  6. echo typeof y # 输出 float64
  7. var z = 3.14159'f32
  8. echo typeof z # 输出 float32

浮点数支持这些运算符 +-*/<<===!=>>=,例子就不举了。

需要注意的是,在浮点数和整数之间不可以直接进行运算,要么把浮点数转成整数(toInt),要么把整数转成浮点数(toFloat)。比如下例中,第四行代码会抛出编译时错误:

  1. var x1: int = 1
  2. var x2: float = 2 + toFloat(x1)
  3. var x3: float = 2 + x1.toFloat()
  4. var x4: float = 2 + x1 # 这一行代码会在编译时抛出错误