在 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
。
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
函數接收變量并返回它的字節大小。使用 unsafe
包可能會帶來可移植性問題,這里只是作為演示使用。如果你將 num8
的值改為 128
運行后就會報錯,因為 int8
類型的最大值為 127
。該程序運行后輸出如下:
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
字節,表示范圍: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
。
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)
}
該程序運行結果如下:
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
有符號整型的區別就在于一個 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
開頭的數表示 十六進制 。
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)
}
該程序的四個數都表示十進制的 99
,程序運行后輸出如下:
num2 = 99
num8 = 99
num10 = 99
num16 = 99
當然,你也可以使用 fmt
包的格式化輸出相應的進制數。
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進制數 num2 = %bn", num2)
fmt.Printf("8進制數 num8 = %on", num8)
fmt.Printf("10進制數 num10 = %dn", num10)
fmt.Printf("16進制數 num16 = %xn", num16)
}
該程序運行后輸出如下:
2進制數 num2 = 1100011
8進制數 num8 = 143
10進制數 num10 = 99
16進制數 num16 = 63
評論
查看更多