整数型
int8 数据范围:-2^7到2^7-1
int16 数据范围:-2^15到2^15-1
int32 数据范围:-2^31到2^31-1
int64 数据范围:-2^63到2^63-1
除了上述整数型,还有默认的数字类型int
以上类型均为有符号型,对应还有无符号型
uint8 数据范围:0到2^8-1
uint16 数据范围:0到2^16-1
uint32 数据范围:0到2^32-1
uint64 数据范围:0到2^64-1
浮点型
float32 单精度
float64 双精度
var price float32 =12.0
fmt.Println(price)
默认情况的小数自动识别为 float64,没有数据类型float
var weight = 170.0
fmt.Println(weight)
fmt.Println(reflect.TypeOf(weight)) //float64
- 打印变量长度
fmt.Println(unsafe.Sizeof(weight)) //8 float64为8个字节,64位
fmt.Println(unsafe.Sizeof(age)) //8 int默认为8个字节,64位
这里我们可以看出默认的int 和 int64 相同,至少在我这台机器的环境下
补充
这里算是插入一点计算机相关的基础,存储单位和有符号型。
单位
我们知道计算机底层是二进制,比如 00000001,而00000001
由8位0,1数字构成,这里存储单位的最小单位 1bit就代表其中1位,也叫1比特,bit简写成b。而这里我们举例为00000001
为8位,我们将8个bit叫一个字节用byte(发音不同 比特 和 百特)通常byte简写成B
1B=8b
1KB= 1024B
1MB=1024KB
1GB=1024MB
1TB=1024GB
1PB=1024TB
1EB=1024PB
1ZB=1024EB
1YB=1024ZB
无符号型
计算机里的数字表示法,因为二进制里没有正负号,所以会把第一位用来标识正负号。正数第一位用0标识,负数的第一位用1标识。那么上面go语言中的int8的1就存储为00000001
,而nt8的-1就存储为10000001
。而int8能表示的负数范围为为10000000
至11111111
为-(2^7-1)至-1,而正数范围为00000001
至01111111
为1至 2^7-1。而0可以用10000000
表示,也可以用00000000
表示(相当于正零和负零),那么为啥上文中写到 int8 数据范围:-2^7至 2^7-1。因为这里我们使用的是原码,计算机中有原码
,补码
,反码
,而计算机语言中有符号型整形用反码表示,范围为 -2^7至 2^7-1。
原码、反码、补码
-
原码是符号位为最高位,0代表正数,1代表负数
-
反码
- 正数的反码不变,保持原来的表示方式
- 负数的反码,符号位保持不变,其余位置取反
-
补码
- 正数还是和原码一致
- 负数的补码,补码的基础上+1
数值1 | 数值-1 | 数值 1+(-1) | |
---|---|---|---|
原码 | 00000001 | 10000001 | 10000010 |
反码 | 00000001 | 11111110 | 11111111 |
补码 | 00000001 | 11111111 | 00000000 |
这里我们再来研究一下0
+0 和 -0 | |
---|---|
原码 | 00000000 和 10000000 |
反码 | 00000000 和 11111111 |
补码 | 00000000 和 100000000(9位溢出了,算出来相当于-128) |
这里我们课易看到 -0在补码中已经溢出了,溢出的 100000000 表示,所以并不存在-0,那么10000000(-0)就可以表示-128