与其它语言一样,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会进行类型推断。常量可以与其它类型兼容,不用转换也可以进行运算。不同类型的数值运算需要先使用下面的方法进行类型转换。注意:类型转换可能会导致精度丢失。
代码语言:javascript复制type(value)
例如:
代码语言:javascript复制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浮点数标准用如下的形式表示一个浮点数:
其中 s 的值可以为0或者1,用来表示浮点数的正负。M 为12或者01之间的小数值。E 为阶码,用于对浮点数加权。例如:小数 3.75 可以表示为:
对于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。
由于存储浮点数的字节数有限,以及不是所有的浮点数都能用二进制精确的表示,所有有的浮点数只是一个近似值,在进行 == 与 != 比较时需要特别注意。