go数值类型(8)
整型,go提供了5种有符号,5种无符号,1种指针,1种单字节,一种单个unicode字符(unicode码点),共13种整数类型,零值均为0.
标识符:int,uint,rune,int8,int16,int32,int64,uint8,uint16,uint32,uint64,byte,uintptr
,其中最为常用的是int类型,rune是单个unicode字符(unicode码点),int8表示8位的Int类型,int16表示int 16位等等。u开头的是无符号,uint8是无符号int8位,uint16是无符号int16位等等。byte一个字节,八位。uintptr是指针类型,与系统有关。
有符号的,0表示正数,1表示负数。表示范围8字节是2^7-2^7-1;无符号表示正数,表示范围是0-2^8-1是256.
- int
package main import "fmt" func main(){ var age int = 18 fmt.Printf("%T %d",age,age) // int 18 }
打印类型和数值%T
和%d
。fmt.Printf("%T %d",age,age)
算数运算
- 加减乘除余
除数不能为0
fmt.Println(9 - 5) //4 fmt.Println(3 * 3) //9 fmt.Println(3 + 3) //6 fmt.Println(9 / 2) //4 fmt.Println(9 % 2) //1
自增和自减
++
加1,--
减1
package main import "fmt" func main(){ var age int = 18 age = 18 age++ fmt.Printf("age++:%dn",age) age-- fmt.Printf("age--:%dn",age) }
运行
[root@LinuxEA /opt/Golang]# go run int.go age++:19 age--:18
关系运算
==
等于,!=
不等于,>
大于,>=
大于等于,<
小于,<=
小于等于
package main import "fmt" func main(){ fmt.Println(1 == 1) fmt.Println(2 != 1) fmt.Println(2 > 3) fmt.Println(2 >= 3) fmt.Println(2 < 3) fmt.Println(2 <= 3) }
运行结果
true true false false true true
位运算
位运算实际上是对二进制进行计算,10进制需要转换成二进制进行计算
&
与 ,|
或 ,^
亦或, <<
左移,>>
右移,&^
按位清空
fmt.Println(7 & 2) // 2 fmt.Println(7 | 2) // 7 fmt.Println(7 ^ 2) // 5 fmt.Println(7 << 2) // 28 fmt.Println(7 >> 2) // 1 fmt.Println(7 &^ 2) // 5
这里使用了辗转相除法也可以运算。
赋值运算
赋值同时可以进行计算,如,=,+=,-=,*=,/=,%=,&=,|=,<<=,>>==,&^=
a+b
等于 a = a+b
age = 1 age += 3 fmt.Println(age) // 1+3=4 age -= 2 fmt.Println(age) // 4-2=2
类型转换
如果两个不同的类型进行运算的时候就需要进行强转换。如果不进行转换就会出错
var int1 int = 10 var int2 uint = 2 fmt.Println(int1 + int2)
当运行时候会抛出错误
[root@LinuxEA /opt/Golang]# go run int.go # command-line-arguments ./int.go:44:19: invalid operation: int1 + int2 (mismatched types int and uint)
这时候必须将两个变量的类型转换一致,且不管是int或者uint,只要一致即可。如下:
var int1 int = 10 var int2 uint = 2 fmt.Println(int1 + int(int2)) // int2的uint转换成int fmt.Println(uint(int1) + int2) // int1的int转换成uint fmt.Printf("%T %T",int1,int2) // int uint
运行
[root@LinuxEA /opt/Golang]# go run int.go 12 12 int uint
- 注意
我们需要注意的是,当一个int32转换成int8的时候,可能会出现溢出。或者如下的16进制转换:
var int3 int = 0XFFFF fmt.Println(int3) // 65535 fmt.Println(uint8(int3)) // 255 fmt.Println(int8(int3)) // -1 fmt.Printf("%T",int3) // int
从大向小转换的时候就可能会出现溢出的问题。
字节与码点
byte是字节,rune表示码点。这两个在赋值的时候可以使用单引号,而int也可以实现,不过int使用的是十进制。当然,byte和rune也是int类型
var a byte = 'A' var b rune = '测' fmt.Println(a,b) // 65 27979 fmt.Printf("%T %T",a,b) // uint8 int32
对于码点的打印使用%U,使用%q
打印字面量的值
fmt.Printf("%q %q",a,b) // 'A' U+6D4B
这里可以做个简单的转换,二进制使用%b
,八进制%o
,十六进制%x
age = 17 fmt.Printf("%T %d %b %o %xn",age,age,age,age,age) // int 17 10001 21 11