数字Number

* 本页面主要介绍Go语言基本数据类型数字Number的相关内容。

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语言支持两种浮点型数:float32float64。这两种浮点型数据格式遵循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语言支持两种精度的复数类型:complex64complex128。分别对应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语言中数字类型我们就讨论到这里,你都了解了吗?


* 本页内容参考以下数据源:

  • 《Go程序设计语言》

凯冰科技 · 代码改变世界,技术改变生活
Next Page→