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),表示 32
或 64
位整型。除非对整型的大小有特定的需求,否则你通常应该使用 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 :根据不同的底层平台,表示 32
或 64
位无符号整型。其类型宽度在 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
的就表示有符号。
接下来讲讲它们表示范围的差别,例如 int8
和 uint8
,它们的类型宽度都为 8
位,能表示的数值个数为 ,对于无符号整数来说,表示的都是正数,所以表示范围为 0
~ 255
,一共 256
个数。而对于有符号整数来说,就得借一位来表示符号,所以表示范围为 -128
~ 127
,刚好也是 256
个数。
对于 int8
, int16
等这些类型后面有跟一个数值的类型来说,它们能表示的数值个数是固定的。而对于 int
, uint
这两个没有指定其大小的类型,在 32
位系统和 64
位系统下的大小是不同的。所以,在有的时候例如在二进制传输、读写文件的结构描述(为了保持文件的结构不会受到不同编译目标平台字节长度的影响)等情况下,使用更加精确的 int32
和 int64
是更好的。
一般我们习惯使用十进制表示法,当然,有时候我们也会使用其他进制表示一个整数。在 Go 中,以 0b
或 0B
开头的数表示 二进制 ,以 0o
或 0O
开头的数表示 八进制 ,以 0x
或 0X
开头的数表示 十六进制 。
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.
相关资源