go语言体系学习(二):数字变量

整数型

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能表示的负数范围为为1000000011111111为-(2^7-1)至-1,而正数范围为0000000101111111 为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

原文地址:https://www.cnblogs.com/mxjhaima/p/14636488.html