补码 位运算 大端序 小端序

81 阅读1分钟

www.cnblogs.com/trmbh12/p/1…

原来(10000000->1111111 表示 -127 -> -0),现在(10000000->1111111 表示 -128 -> -1)

golang对于有符号整型的取反操作看起来不是按位取反,位运算时全都转成 uintxx 再计算

var a int8
a = 1
log.Println(^a) // -2

int负数转uint不是去掉负号

var a int32
a = -10
log.Println(uint32(a), math.MaxUint32) // 返回 math.MaxUint32 - 9
log.Println(^a)                        // 返回 9

负数转补码,传参为负数部分

func bumaNegative(num uint32) uint32 {
    return uint32(^num+1) | uint32(1<<31) //负数部分取反 再 加 1, 再拼上最高位
}
func bumaHex(num uint32, isNegative bool) string {
    var tmp uint32
    if isNegative {
       tmp = (^num+1) | uint32(1<<31) //负数部分取反 再 加 1, 再拼上最高位
    } else {
       tmp = num
    }
    return fmt.Sprintf("%08X", tmp) //08表示输出8个字符,X是输出16进制
}

补码转负数

func bumaToInt(binaryString string) int {
	n := len(binaryString)
	if n == 32 && binaryString[0] == '1' {
		strInt, _ := strconv.ParseInt(binaryString[1:], 2, 32)
		ans := ^(uint32(strInt - 1)) & uint32(1<<31-1) // 最高位置0
		return -int(ans)
	} else {
		strInt, _ := strconv.ParseInt(binaryString, 2, 32)
		return int(strInt)
	}
}

大端序 小端序

image.png

大端序:最高有效字节(MSB)存储在最低内存地址(类似人类书写顺序)。

小端序(Little-Endian) 的表示会是 02 00 01 00(低位字节在前)。

网络传输(如 TCP/IP)通常使用 大端序(网络字节序)。