与其它语言一样,Go语言支持整型和浮点型数值。不同的是,Go语言是强类型语言,数值运算需要在同一种类型的数值之间进行。

Go语言内置的数值类型都支持下面所列的运算:

语法 描述
+x x
-x x的负值
x++ x加上常量1
x– x减去常量1
x + y x加上y
x - y x减去y
x * y x乘以y
x / y x除以y
x += y x = x + y
x -= y x = x - y
x *=y x = x * y
x /=y x = x / y

类型转换

数值类型的变量在定义时就需要指定其类型,如果没有指定,Go会进行类型推断。常量可以与其它类型兼容,不用转换也可以进行运算。不同类型的数值运算需要先使用下面的方法进行类型转换。注意:类型转换可能会导致精度丢失。

1
type(value)

例如:

1
2
3
4
5
6
7
8
9
10
11
12
package main

import "fmt"

func main() {
const times = 3 // 定义常量
i := 20 // 未指定其类型,推断为 int
j := int16(20) // 等同于 var j int16 = 20
i *= times // 常量可以与任意整数类型运算
i += int(j) // int类型变量与int16类型变量运算需要先进行类型转换
fmt.Println(i)
}

整型

Go语言所有的整数类型如下所示:

类型 描述
int 32位平台等同于int32, 64位平台等同于int64
int8 有符号 8 位整型 (-128 到 127)
int16 有符号 16 位整型 (-32768 到 32767)
int32 有符号 32 位整型 (-2147483648 到 2147483647)
int64 有符号 64 位整型 (-9223372036854775808 到 9223372036854775807)
uint8 无符号 8 位整型 (0 到 255)
uint16 无符号 16 位整型 (0 到 65535)
uint32 无符号 32 位整型 (0 到 4294967295)
uint64 无符号 64 位整型 (0 到 18446744073709551615)
byte 等同于uint8
rune 等同于uint32
uintptr 32位平台等同于uint32, 64位平台等同于uint64

只有整型数值支持的运算如下:

语法 描述
^x 按位取反
x % y x除以y的余数
x & y x按位与运算
x | y x按位或运算
x ^ y x异或y
x &^ x y按位与非运算
x << u x 左移 u位 高位丢弃,低位补0
x >> u x 右移 u位 低位丢弃,高位补0
x %= y x = x % y
x = y
x ^= y x = x ^ y
x &^ y x = x & y
x >>= u x = x >> u
x <<= u x = x << u

浮点型

IEEE浮点数的表示

IEEE浮点数标准用如下的形式表示一个浮点数:

$$ V = (-1)^s \times M \times 2^E $$

其中 s 的值可以为0或者1,用来表示浮点数的正负。M 为12或者01之间的小数值。E 为阶码,用于对浮点数加权。例如:小数 3.75 可以表示为:

$$ (-1)^0 \times 1\frac{7}{8} \times 2^1 $$

对于float32来说,其中 s 占 1 位,E 占8位,M 占剩下的23位。对于float64来说,s 占1位,E 占11位,M 占剩下的52位。
为了产生 -126 ~ 127之间的E的取值, float32中表示E的8位,作为无符号整数,需要减去一个偏置值 127. float64与之类似。
因此,Go语言中的浮点类型有两种,与之对应,即float32和float64。

由于存储浮点数的字节数有限,以及不是所有的浮点数都能用二进制精确的表示,所有有的浮点数只是一个近似值,在进行 == 与 != 比较时需要特别注意。