原来(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)
}
}
大端序 小端序
大端序:最高有效字节(MSB)存储在最低内存地址(类似人类书写顺序)。
小端序(Little-Endian) 的表示会是 02 00 01 00(低位字节在前)。
网络传输(如 TCP/IP)通常使用 大端序(网络字节序)。