func main() {
// 这个表达式可以得到最大的正的int类型的值
a := int(^uint(0) >> 1)
fmt.Println(a)//9223372036854775807
b := uint(0) // 无符号0
fmt.Printf("%b\n", b)//0
c := ^b//取反
fmt.Printf("%b\n", c)// 1111111111111111111111111111111111111111111111111111111111111111 64位1,go中int的字节与操作系统有关
d := c >> 1//右移一位
fmt.Printf("%b\n", d)// 111111111111111111111111111111111111111111111111111111111111111 63位1,最高位为0
e := int(d)//类型转化为有符号int
fmt.Printf("%b\n", e)//111111111111111111111111111111111111111111111111111111111111111 63位1,最高位为0
fmt.Println(e)// 9223372036854775807 最大的有符号int
fmt.Printf("%b\n", e+1)//-1000000000000000000000000000000000000000000000000000000000000000 1个1,63个0,这是负数的补码,取反加1转化为二进制,前面这个负号是go语言自己加的吧
fmt.Println(e + 1)// -9223372036854775808,最小的有符号int
}
其实很好理解,例如对于一个字节的数,比如c语言的short类型:
最大值为127,最小值为-128
127的二进制:01111111
-128的二进制:-10000000 --> 补码
原文:https://www.cnblogs.com/gyyyl/p/13672364.html