签名号码的Golang左/右移动行为

时间:2017-10-23 08:37:29

标签: go int bit-manipulation bit-shift signed

有人可以解释一下Golang中的左/右移位行为。请在此处参阅示例代码:https://play.golang.org/p/7vjwCbOEkw

package main

import (
    "fmt"
)

func main() {
    var lf int8 = -3
    fmt.Printf("-3 : %08b\n", lf)
    fmt.Printf("<<1: %08b\n", lf<<1)
    fmt.Printf("<<2: %08b\n", lf<<2)
    fmt.Printf("<<3: %08b\n", lf<<3)
    fmt.Printf("<<4: %08b\n", lf<<4)
    fmt.Printf("<<5: %08b, %d\n", lf<<5, lf<<5)
    fmt.Printf("<<6: %08b, %d\n", lf<<6, lf<<6)
    fmt.Printf("<<7: %08b, %d\n", lf<<7, lf<<7)
    fmt.Printf("<<8: %08b, %d\n", lf<<8, lf<<8)
    fmt.Printf("<<9: %08b, %d\n", lf<<9, lf<<9)
}

-3 : -0000011
<<1: -0000110
<<2: -0001100
<<3: -0011000
<<4: -0110000
<<5: -1100000, -96
<<6: 01000000, 64
<<7: -10000000, -128
<<8: 00000000, 0
<<9: 00000000, 0

1 个答案:

答案 0 :(得分:5)

-3位于two's complement11111101,您在程序打印-0000011时看到的是-和绝对值的二进制表示数量。在2的补码中,对于正数(包括零),最高位为0,对于负数,最高位为1。如果您将此数字(11111101)向左移动,则较低的7位向左移动一位,而0从右侧移入,替换最低位。在您的示例中进行移动将导致:

11111101 -3 11111010 -6 11110100 -12 11101000 -24 11010000 -48 10100000 -96 01000000 64 10000000 -128 00000000 0 00000000 0 ...

你必须将所有位模式视为两个补码,一旦你知道它是如何工作的,一切都会有意义。