一行表达式生成最大的int类型的数

直接上一段代码,这是从go语言源码中提取出来的:

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 --> 补码10000000

正数取反加1就得到相应的负数

例如1的二进制00000001  -->   取反11111110  -->  加1得到-1:11111111:这就是-1的二进制表示

posted @ 2020-09-15 12:05  胖胖咩  阅读(229)  评论(0)    收藏  举报