Go语言中的数值类型

2024-10-09 21:06:56 浏览数 (1)

与其它语言一样,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浮点数标准用如下的形式表示一个浮点数:

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

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

(-1)^0 times 1frac{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。

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

0 人点赞