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

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

语法描述
+xx
-xx的负值
x++x加上常量1
x–x减去常量1
x + yx加上y
x - yx减去y
x * yx乘以y
x / yx除以y
x += yx = x + y
x -= yx = x - y
x *=yx = x * y
x /=yx = 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语言所有的整数类型如下所示:

类型描述
int32位平台等同于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
uintptr32位平台等同于uint32, 64位平台等同于uint64

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

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

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