3 回答

TA贡献1783条经验 获得超4个赞
我相信答案在于fmt模块如何格式化二进制数,而不是内部格式。
如果您看一下fmt.integer,该函数首先执行的操作之一是将带负号的整数转换为正整数:
165 negative := signedness == signed && a < 0
166 if negative {
167 a = -a
168 }
然后在此处-输出的字符串前面附加逻辑。
IOW-101确实以二进制形式-附加。5
注意:在print.gofmt.integer中调用,它本身在同一个函数中调用。pp.fmtInt64pp.printArg

TA贡献1818条经验 获得超7个赞
这是一种不使用的方法unsafe:
package main
import (
"fmt"
"math/bits"
)
func unsigned8(x uint8) []byte {
b := make([]byte, 8)
for i := range b {
if bits.LeadingZeros8(x) == 0 {
b[i] = 1
}
x = bits.RotateLeft8(x, 1)
}
return b
}
func signed8(x int8) []byte {
return unsigned8(uint8(x))
}
func main() {
b := signed8(-5)
fmt.Println(b) // [1 1 1 1 1 0 1 1]
}
在这种情况下,您也可以使用[8]byte,但如果您有一个正整数并且想要修剪前导零,则上述方法会更好。
https://golang.org/pkg/math/bits#RotateLeft

TA贡献2080条经验 获得超4个赞
必须使用不安全指针才能正确表示二进制格式的负数。
package main
import (
"fmt"
"strconv"
"unsafe"
)
func bInt8(n int8) string {
return strconv.FormatUint(uint64(*(*uint8)(unsafe.Pointer(&n))), 2)
}
func main() {
fmt.Println(bInt8(-5))
}
输出
11111011
- 3 回答
- 0 关注
- 132 浏览
添加回答
举报