Go语言中的数字类型包括 整数、浮点数和复数。它们分别有各自的大小范围,对正负号的支持也各不相同。
一、整数
Go语言中整数分为有符号数和无符号数。按长度来分,可以有:
- 有符号:int8、int16、int32、int64
- 无符号:uint8、uint16、uint32、uint64
其中,uint8就是我们熟知的byte型,int16对应C语言中的short型,int64对应C语言中的long型。 int32等价于Unicode字符rune类型,用于表示一个Unicode码点。
另外还有两种一般对应特定CPU平台机器字大小的有符号和无符号整数int和uint,一般情况下,在特定的平台上,它们与原生的有符号/无符号数相同,或等于该平台上运算效率最高的值。但是也不能对此确认,因为不同的编译器即使在相同的硬件平台上可能产生不同的大小。
最后,还有一种无符号的整数类型uintptr,没有指定具体的bit大小但是足以容纳指针,只有在底层编程时才需要。
有符号数通常使用补码方式表示,保留最高位为符号位。无符号数的全部位都作为有效位构成其非负值。
下面是Go语言中关于算术运算、逻辑运算和比较运算的二元运算符,它们按照优先级递减的顺序排列:
* / % << >> & &^
+ - | ^
== != < <= > >=
&&
||
要注意,取模运算符%仅用于整数间的运算。Go语言中,%取模运算符的符号和被取模数的符号总是一致的,因此-5%3和-5%-3结果都是-2。
一元加法和减法运算,对于整数,+x是0+x的简写,-x则是0-x的简写;对于浮点数和复数,+x就是x,-x则是x 的负数。
Go语言还提供了以下的bit位操作运算符,前面4个操作运算符并不区分是有符号还是无符号数:
& 位运算 AND
| 位运算 OR
^ 位运算 XOR
&^ 位清空(AND NOT)
<< 左移
>> 右移
需要注意的是,尽管Go语言提供了无符号数的运算,但即使数值本身不可能出现负数,我们还是倾向于使用有符号的int类型,无符号数往往只有在位运算或其它特殊的运算场景才会使用。
二、浮点数
Go语言支持两种浮点型数:float32和float64。这两种浮点型数据格式遵循IEEE 754标准(被所有现代的CPU支持)。
- float32:最大范围约为 3.4e38,可以使用常量定义:math.MaxFloat32。
- float64:最大范围约为 1.8e308,可以使用常量定义:math.MaxFloat64。
在需要使用浮点数的场景下,通常应该优先使用float64类型,因为float32类型的累计计算误差很容易扩散,并且float32能精确表示的正整数并不是很大(译注:因为float32的有效bit位只有23个,其它的bit位用于指数和符号;当整数大于23bit能表达的范围时,float32的表示将出现误差)。
const e = 2.71828 // (approximately)
const Avogadro = 6.02214129e23 // 阿伏伽德罗常数
const Planck = 6.62606957e-34 // 普朗克常数
// 打印
for x := 0; x < 8; x++ {
//打印e的幂,小数点后三个小数精度和8个字符宽度
fmt.Printf("x = %d e^x = %8.3f\n", x, math.Exp(float64(x)))
}
math包中提供了IEEE754浮点数标准中定义的特殊值的创建和测试:正无穷大和负无穷大,分别用于表示太大溢出的数字和除零的结果;还有NaN非数,一般用于表示无效的除法操作结果0/0或Sqrt(-1)。
var z float64
fmt.Println(z, -z, 1/z, -1/z, z/z) // "0 -0 +Inf -Inf NaN"
三、复数
Go语言支持两种精度的复数类型:complex64和complex128。分别对应float32和float64两种浮点数精度。
内置的complex函数用于构建复数,内建的real和imag函数分别返回复数的实部和虚部。
var x complex128 = complex(1, 2) // 1+2i
var y complex128 = complex(3, 4) // 3+4i
fmt.Println(x*y) // "(-5+10i)"
fmt.Println(real(x*y)) // "-5"
fmt.Println(imag(x*y)) // "10"
复数可以用==和!=进行相等比较。只有两个复数的实部和虚部都相等的时候它们才是相等的。math/cmplx包提供了复数处理的许多函数,例如求复数的平方根函数和求幂函数。
fmt.Println(cmplx.Sqrt(-1)) // "(0+1i)"
关于Go语言中数字类型我们就讨论到这里,你都了解了吗?