在 Go 語言中,整型可以細(xì)分成兩個(gè)種類十個(gè)類型。
有符號整型
int8 :表示 8
位有符號整型;其類型寬度為 8
位,即 1
字節(jié),表示范圍:-128
~ 127
。
int16 :表示 16
位有符號整型;其類型寬度為 16
位,即 2
字節(jié),表示范圍:-32768
~ 32767
。
int32 :表示 32
位有符號整型;其類型寬度為 32
位,即 4
字節(jié),表示范圍:-2147483648
~ 2147483647
。
int64 :表示 64
位有符號整型;其類型寬度為 64
位,即 8
字節(jié),表示范圍:-9223372036854775808
~ 9223372036854775807
。
int :根據(jù)不同的底層平臺(tái)(Underlying Platform),表示 32
或 64
位整型。除非對整型的大小有特定的需求,否則你通常應(yīng)該使用 int
表示整型。其類型寬度在 32
位系統(tǒng)下是 32
位,而在 64
位系統(tǒng)下是 64
位。表示范圍:在 32
位系統(tǒng)下是 -2147483648
~ 2147483647
,而在 64
位系統(tǒng)是 -9223372036854775808
~ 9223372036854775807
。
package main
import (
"fmt"
"math"
"unsafe"
)
func main() {
var num8 int8 = 127
var num16 int16 = 32767
var num32 int32 = math.MaxInt32
var num64 int64 = math.MaxInt64
var num int = math.MaxInt
fmt.Printf("type of num8 is %T, size of num8 is %d, num8 = %dn",
num8, unsafe.Sizeof(num8), num8)
fmt.Printf("type of num16 is %T, size of num16 is %d, num16 = %dn",
num16, unsafe.Sizeof(num16), num16)
fmt.Printf("type of num32 is %T, size of num32 is %d, num32 = %dn",
num32, unsafe.Sizeof(num32), num32)
fmt.Printf("type of num64 is %T, size of num64 is %d, num64 = %dn",
num64, unsafe.Sizeof(num64), num64)
fmt.Printf("type of num is %T, size of num is %d, num = %dn",
num, unsafe.Sizeof(num), num)
}
其中,程序中的 Printf
方法,可以使用 %T
格式說明符(Format Specifier)打印出變量的類型。而 unsafe
包的 Sizeof
函數(shù)接收變量并返回它的字節(jié)大小。使用 unsafe
包可能會(huì)帶來可移植性問題,這里只是作為演示使用。如果你將 num8
的值改為 128
運(yùn)行后就會(huì)報(bào)錯(cuò),因?yàn)?int8
類型的最大值為 127
。該程序運(yùn)行后輸出如下:
type of num8 is int8, size of num8 is 1, num8 = 127
type of num16 is int16, size of num16 is 2, num16 = 32767
type of num32 is int32, size of num32 is 4, num32 = 2147483647
type of num64 is int64, size of num64 is 8, num64 = 9223372036854775807
type of num is int, size of num is 8, num = 9223372036854775807
無符號整型
uint8 :表示 8
位無符號整型;其類型寬度為 8
位,即 1
字節(jié),表示范圍:0
~ 255
。
uint16 :表示 16
位無符號整型;其類型寬度為 16
位,即 2
字節(jié),表示范圍:0
~ 65535
。
uint32 :表示 32
位無符號整型;其類型寬度為 32
位,即 4
字節(jié),表示范圍:0
~ 4294967295
。
uint64 :表示 64
位無符號整型;其類型寬度為 64
位,即 8
字節(jié),表示范圍:0
~ 18446744073709551615
。
uint :根據(jù)不同的底層平臺(tái),表示 32
或 64
位無符號整型。其類型寬度在 32
位系統(tǒng)下是 32
位,而在 64
位系統(tǒng)下是 64
位。表示范圍在 32
位系統(tǒng)下是 0
~ 4294967295
,而在 64
位系統(tǒng)是 0
~ 18446744073709551615
。
package main
import (
"fmt"
"math"
"unsafe"
)
func main() {
var num8 uint8 = 128
var num16 uint16 = 32768
var num32 uint32 = math.MaxUint32
var num64 uint64 = math.MaxUint64
var num uint = math.MaxUint
fmt.Printf("type of num8 is %T, size of num8 is %d, num8 = %dn",
num8, unsafe.Sizeof(num8), num8)
fmt.Printf("type of num16 is %T, size of num16 is %d, num16 = %dn",
num16, unsafe.Sizeof(num16), num16)
fmt.Printf("type of num32 is %T, size of num32 is %d, num32 = %dn",
num32, unsafe.Sizeof(num32), num32)
fmt.Printf("type of num64 is %T, size of num64 is %d, num64 = %dn",
num64, unsafe.Sizeof(num64), num64)
fmt.Printf("type of num is %T, size of num is %d, num = %dn",
num, unsafe.Sizeof(num), num)
}
該程序運(yùn)行結(jié)果如下:
type of num8 is uint8, size of num8 is 1, num8 = 128
type of num16 is uint16, size of num16 is 2, num16 = 32768
type of num32 is uint32, size of num32 is 4, num32 = 4294967295
type of num64 is uint64, size of num64 is 8, num64 = 18446744073709551615
type of num is uint, size of num is 8, num = 18446744073709551615
uint
無符號整型和 int
有符號整型的區(qū)別就在于一個(gè) u
,有 u
的就表示無符號,沒有 u
的就表示有符號。
接下來講講它們表示范圍的差別,例如 int8
和 uint8
,它們的類型寬度都為 8
位,能表示的數(shù)值個(gè)數(shù)為 ,對于無符號整數(shù)來說,表示的都是正數(shù),所以表示范圍為 0
~ 255
,一共 256
個(gè)數(shù)。而對于有符號整數(shù)來說,就得借一位來表示符號,所以表示范圍為 -128
~ 127
,剛好也是 256
個(gè)數(shù)。
對于 int8
, int16
等這些類型后面有跟一個(gè)數(shù)值的類型來說,它們能表示的數(shù)值個(gè)數(shù)是固定的。而對于 int
, uint
這兩個(gè)沒有指定其大小的類型,在 32
位系統(tǒng)和 64
位系統(tǒng)下的大小是不同的。所以,在有的時(shí)候例如在二進(jìn)制傳輸、讀寫文件的結(jié)構(gòu)描述(為了保持文件的結(jié)構(gòu)不會(huì)受到不同編譯目標(biāo)平臺(tái)字節(jié)長度的影響)等情況下,使用更加精確的 int32
和 int64
是更好的。
不同進(jìn)制的表示方法
一般我們習(xí)慣使用十進(jìn)制表示法,當(dāng)然,有時(shí)候我們也會(huì)使用其他進(jìn)制表示一個(gè)整數(shù)。在 Go 中,以 0b
或 0B
開頭的數(shù)表示 二進(jìn)制 ,以 0o
或 0O
開頭的數(shù)表示 八進(jìn)制 ,以 0x
或 0X
開頭的數(shù)表示 十六進(jìn)制 。
package main
import (
"fmt"
)
func main() {
var num2 int = 0b1100011
var num8 int = 0o143
var num10 int = 99
var num16 int = 0X63
fmt.Println("num2 = ", num2)
fmt.Println("num8 = ", num8)
fmt.Println("num10 = ", num10)
fmt.Println("num16 = ", num16)
}
該程序的四個(gè)數(shù)都表示十進(jìn)制的 99
,程序運(yùn)行后輸出如下:
num2 = 99
num8 = 99
num10 = 99
num16 = 99
當(dāng)然,你也可以使用 fmt
包的格式化輸出相應(yīng)的進(jìn)制數(shù)。
package main
import (
"fmt"
)
func main() {
var num2 int = 0b1100011
var num8 int = 0o143
var num10 int = 99
var num16 int = 0X63
fmt.Printf("2進(jìn)制數(shù) num2 = %bn", num2)
fmt.Printf("8進(jìn)制數(shù) num8 = %on", num8)
fmt.Printf("10進(jìn)制數(shù) num10 = %dn", num10)
fmt.Printf("16進(jìn)制數(shù) num16 = %xn", num16)
}
該程序運(yùn)行后輸出如下:
2進(jìn)制數(shù) num2 = 1100011
8進(jìn)制數(shù) num8 = 143
10進(jìn)制數(shù) num10 = 99
16進(jìn)制數(shù) num16 = 63
評論
查看更多