目录
Go语言中数据类型分为俩大类:基本数据类型、复合数据类型
基本数据类型又分为:整型、浮点型、布尔型、字符串(byte、rune)
符合数据类型分为:数组、切片、结构体、函数、map、通道、接口等等
本章着重了解Go数据类型的整型:
整型同样也可以划分为三个类型:
整型
1.有符号整型按长度分为:int8 , int16 , int32 , int64
int16对应C语言中的short型、int64对应C语言中的long型
什么叫做有符号整型呢?---我们以占用一个字节的int8整型来作为例子
符号位 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
0/1(0代表负数---1代表x | x | x | x | x | x | x | x |
这样的话,就奠定了它的存储范围:
类型 | 范围 | 占用空间 |
int8 | (-128-127) -2的7次方-2的7次方减一 | 1字节 |
int16 | (-32768-32767) -2的15次方-2的15次方减一 | 2字节 |
int32 | (-2147483648-2147483647) -2的31次方-2的31次方减一 | 4字节 |
int64 | (-9223372036854775808-9223372036854775807) -2的63次方-2的63次方减一 | 8字节 |
2.无符号整型uint分为:uint8,uint16,uint32,uint64
我们依然来看一下uint类型的uint8存储:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
x | x | x | x | x | x | x | x |
可以看出来uint类型是没有符号的
类型 | 范围 | 占用空间 |
uint8 | (0-255) 0-2的8次方减一 | 1字节 |
uint16 | (0-65535) 0-2的16次方减一 | 2字节 |
uint32 | (0-4294967295) 0-2的32次方减一 | 4字节 |
uint64 | (0-18446744073709551615) 0-2的64次方减一 | 8字节 |
3.无符号整型-用于存放指针uintptr
unsafe.Sizeof
unsafe.Sizeof可以用来查看不同长度的整型在内存中的存储空间
(需要导入unsafe包)
package main
import (
"fmt"
"unsafe"
)
func main() {
var num int16 = 888
var num1 int8 = 20
fmt.Println(unsafe.Sizeof(num))
fmt.Println(unsafe.Sizeof(num1))
}
我们打印出来的就是它的占用空间(字节)了
什么是字节?---
字节(Byte)是计算机数据的基本存储单位
8bit(位) = 1Byte(字节)
1024Byte = 1KB
1024KB = 1MB ......
int类型转换
假如我们现在遇到了这样一个问题:
我们想要把int16类型的数据与int32类型的数据相加,我们发现已经报错了
长度不同的数据类型是不能进行相加的,所以我们想到了数据类型的转换:
var num int16 = 888
var num1 int32 = 8888
fmt.Println(num + int16(num1))
fmt.Println(int32(num) + num1)
不过在强制转换的同时,我们也需要格外注意高位向地位转换(如果数值太大的话,数据类型开辟的字节空间不能够放下数据,那么就会出错)
eg:
func main() {
var num int16 = 32767
var num1 int32 = 8888
fmt.Println(num + int16(num1))
fmt.Println(int32(num) + num1)
}
我们发现16位的空间已经存储不下41655这个数值了,所以结果出错
整型相关数字字面量语法
数字字面量语法方便了我们开发者以二进制、八进制、十六进制、浮点数的格式来定义数字
func main() {
v := 0b00101101
fmt.Println(v)
}
fmt格式普通与整型占位符"占位符"
func main() {
type Test struct {
Name string
}
var people = Test{Name: "小蜗"}
num := 666
fmt.Println(num)
//%v: 相应值的默认格式
fmt.Printf("%v\n", num)
fmt.Printf("%v\n", people)
//%+v: 打印结构体时,会添加字段名
fmt.Printf("%+v\n", num)
fmt.Printf("%+v\n", people)
//%#v: 相应值的Go语法表示
fmt.Printf("%#v\n", num)
fmt.Printf("%#v\n", people)
//%T: 相应值的类型的Go语法表示
fmt.Printf("%T\n", num)
//%%: 字面上的百分号,并非值的占位符
fmt.Printf("%%\n")
//%b: 二进制表示
fmt.Printf("%b\n", num)
//%c: 相应Unicode码点所表示的字符
fmt.Printf("%c\n", num)
//%U: Unicode格式
fmt.Printf("%U\n", num)
//%d: 十进制表示
fmt.Printf("%d\n", num)
//%o: 八进制表示
fmt.Printf("%o\n", num)
//%q: 单引号包裹的字符字面值,由Go语法安全转义
fmt.Printf("%q\n", num)
//%x: 十六进制表示,字母形式为小写 a-f
fmt.Printf("%x\n", num)
//%X: 十六进制表示,字母形式为大写 A-F
fmt.Printf("%X\n", num)
}