Go 语言系列4:整型

发布于 2021-11-18 17:06 ,所属分类:软件编程学习资料

在 Go 语言中,整型可以细分成两个种类十个类型。

int8表示 8 位有符号整型;其类型宽度为 8 位,即 1 字节,表示范围:-128 ~ 127

int16 :表示 16 位有符号整型;其类型宽度为 16 位,即 2 字节,表示范围:-32768 ~ 32767

int32 :表示 32 位有符号整型;其类型宽度为 32 位,即 4 字节,表示范围:-2147483648 ~ 2147483647

int64 :表示 64 位有符号整型;其类型宽度为 64 位,即 8 字节,表示范围:-9223372036854775808 ~ 9223372036854775807

int :根据不同的底层平台(Underlying Platform),表示 3264 位整型。除非对整型的大小有特定的需求,否则你通常应该使用 int 表示整型。其类型宽度在 32 位系统下是 32 位,而在 64 位系统下是 64 位。表示范围:在 32 位系统下是 -2147483648 ~ 2147483647 ,而在 64 位系统是 -9223372036854775808 ~ 9223372036854775807

packagemain

import(
"fmt"
"math"
"unsafe"
)

funcmain(){
varnum8int8=127
varnum16int16=32767
varnum32int32=math.MaxInt32
varnum64int64=math.MaxInt64
varnumint=math.MaxInt
fmt.Printf("typeofnum8is%T,sizeofnum8is%d,num8=%d\n",
num8,unsafe.Sizeof(num8),num8)
fmt.Printf("typeofnum16is%T,sizeofnum16is%d,num16=%d\n",
num16,unsafe.Sizeof(num16),num16)
fmt.Printf("typeofnum32is%T,sizeofnum32is%d,num32=%d\n",
num32,unsafe.Sizeof(num32),num32)
fmt.Printf("typeofnum64is%T,sizeofnum64is%d,num64=%d\n",
num64,unsafe.Sizeof(num64),num64)
fmt.Printf("typeofnumis%T,sizeofnumis%d,num=%d\n",
num,unsafe.Sizeof(num),num)
}

其中,程序中的 Printf 方法,可以使用 %T 格式说明符(Format Specifier)打印出变量的类型。而 unsafe 包的 Sizeof 函数接收变量并返回它的字节大小。使用 unsafe 包可能会带来可移植性问题,这里只是作为演示使用。如果你将 num8 的值改为 128 运行后就会报错,因为 int8 类型的最大值为 127 。该程序运行后输出如下:

typeofnum8isint8,sizeofnum8is1,num8=127
typeofnum16isint16,sizeofnum16is2,num16=32767
typeofnum32isint32,sizeofnum32is4,num32=2147483647
typeofnum64isint64,sizeofnum64is8,num64=9223372036854775807
typeofnumisint,sizeofnumis8,num=9223372036854775807

uint8 :表示 8 位无符号整型;其类型宽度为 8 位,即 1 字节,表示范围:0 ~ 255

uint16 :表示 16 位无符号整型;其类型宽度为 16 位,即 2 字节,表示范围:0 ~ 65535

uint32 :表示 32 位无符号整型;其类型宽度为 32 位,即 4 字节,表示范围:0 ~ 4294967295

uint64 :表示 64 位无符号整型;其类型宽度为 64 位,即 8 字节,表示范围:0 ~ 18446744073709551615

uint :根据不同的底层平台,表示 3264 位无符号整型。其类型宽度在 32 位系统下是 32 位,而在 64 位系统下是 64 位。表示范围在 32 位系统下是 0 ~ 4294967295 ,而在 64 位系统是 0 ~ 18446744073709551615

packagemain

import(
"fmt"
"math"
"unsafe"
)

funcmain(){
varnum8uint8=128
varnum16uint16=32768
varnum32uint32=math.MaxUint32
varnum64uint64=math.MaxUint64
varnumuint=math.MaxUint
fmt.Printf("typeofnum8is%T,sizeofnum8is%d,num8=%d\n",
num8,unsafe.Sizeof(num8),num8)
fmt.Printf("typeofnum16is%T,sizeofnum16is%d,num16=%d\n",
num16,unsafe.Sizeof(num16),num16)
fmt.Printf("typeofnum32is%T,sizeofnum32is%d,num32=%d\n",
num32,unsafe.Sizeof(num32),num32)
fmt.Printf("typeofnum64is%T,sizeofnum64is%d,num64=%d\n",
num64,unsafe.Sizeof(num64),num64)
fmt.Printf("typeofnumis%T,sizeofnumis%d,num=%d\n",
num,unsafe.Sizeof(num),num)
}

该程序运行结果如下:

typeofnum8isuint8,sizeofnum8is1,num8=128
typeofnum16isuint16,sizeofnum16is2,num16=32768
typeofnum32isuint32,sizeofnum32is4,num32=4294967295
typeofnum64isuint64,sizeofnum64is8,num64=18446744073709551615
typeofnumisuint,sizeofnumis8,num=18446744073709551615

uint 无符号整型和 int 有符号整型的区别就在于一个 u ,有 u 的就表示无符号,没有 u 的就表示有符号。

接下来讲讲它们表示范围的差别,例如 int8uint8 ,它们的类型宽度都为 8 位,能表示的数值个数为 ,对于无符号整数来说,表示的都是正数,所以表示范围为 0 ~ 255 ,一共 256 个数。而对于有符号整数来说,就得借一位来表示符号,所以表示范围为 -128 ~ 127 ,刚好也是 256 个数。

对于 int8int16 等这些类型后面有跟一个数值的类型来说,它们能表示的数值个数是固定的。而对于 intuint 这两个没有指定其大小的类型,在 32 位系统和 64 位系统下的大小是不同的。所以,在有的时候例如在二进制传输、读写文件的结构描述(为了保持文件的结构不会受到不同编译目标平台字节长度的影响)等情况下,使用更加精确的 int32int64 是更好的。

一般我们习惯使用十进制表示法,当然,有时候我们也会使用其他进制表示一个整数。在 Go 中,以 0b0B 开头的数表示 二进制 ,以 0o0O 开头的数表示 八进制 ,以 0x0X 开头的数表示 十六进制

packagemain

import(
"fmt"
)

funcmain(){
varnum2int=0b1100011
varnum8int=0o143
varnum10int=99
varnum16int=0X63
fmt.Println("num2=",num2)
fmt.Println("num8=",num8)
fmt.Println("num10=",num10)
fmt.Println("num16=",num16)
}

该程序的四个数都表示十进制的 99 ,程序运行后输出如下:

num2=99
num8=99
num10=99
num16=99

当然,你也可以使用 fmt 包的格式化输出相应的进制数。

packagemain

import(
"fmt"
)

funcmain(){
varnum2int=0b1100011
varnum8int=0o143
varnum10int=99
varnum16int=0X63
fmt.Printf("2进制数num2=%b\n",num2)
fmt.Printf("8进制数num8=%o\n",num8)
fmt.Printf("10进制数num10=%d\n",num10)
fmt.Printf("16进制数num16=%x\n",num16)
}

该程序运行后输出如下:

2进制数num2=1100011
8进制数num8=143
10进制数num10=99
16进制数num16=63

参考文献:

[1] Alan A. A. Donovan; Brian W. Kernighan, Go 程序设计语言, Translated by 李道兵, 高博, 庞向才, 金鑫鑫 and 林齐斌, 机械工业出版社, 2017.


相关资源