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 關注
- 153 瀏覽
添加回答
舉報