之前是写java的,没有无符号有符号之分,最近刷题碰到了位运算的题,就想把这个搞清楚一点。
整数类型
类型 | 范围 |
---|---|
int8 | -128到127 |
uint8 | 0到255 |
int16 | -32768到32767 |
uint16 | 0到65535 |
int32 | -2147483648到2147483647 |
uint32 | 0到4294967295 |
int64 | -9223372036854775808到9223372036854775807 |
uint64 | 0到18446744073709551615 |
另外常用的int类型是有符号数,位长取决于你的电脑的位长,电脑是64位的int就是64位的。
位移运算符
左移 <<
右移>>
规则
首先无符号数没啥好说的,不管左移还是右移都是补0
有符号数,以int为例(64位)
老样子,机器内存的是补码
以7fffffffffffffffff为例
a := 0x7fffffffffffffff
fmt.Printf("%x",a)
//out :7fffffffffffffff
b=-0x7fffffffffffffff
fmt.Printf("%x",b)
//out:-7fffffffffffffff
c := 0xffffffffffffffff
fmt.Printf("%x",a)
//err :超出范围
a =a<<1
fmt.Printf("%x",a)
//out:-2
a = a>>1
//out -1
a= a>>100
//out -1
从前三个输出看,没有办法直接给int赋最大值(16进制),全f的话会报错,也就是不能直接赋值符号位,
但是第四个输出来看,这里的运算是逻辑位移,输出-2(ffffffffffffffe,找了半天也没找到怎样输出正儿八经的16进制数),也就是位移包括符号位.
之后再右移多少位都是-1(ffffff...f),就是补码位移规则
综上:
- int类型 赋值要标明符号
- 位移运算符号位参加,按照补码运算规则(左移补0,右移补符号位
。。。。好乱
网友评论