亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

二進制補碼和 fmt.Printf

二進制補碼和 fmt.Printf

Go
慕姐8265434 2022-01-17 10:32:06
所以計算機使用二進制補碼在內部表示有符號整數。即,-5 表示為 ^5 + 1 = "1111 1011"。但是,嘗試打印二進制表示,例如以下代碼:var i int8 = -5fmt.Printf("%b", i)輸出-101。不完全是我所期望的。格式是不同的還是根本不使用二進制補碼?有趣的是,轉換為 unsigned int 會產生“正確”的位模式:var u uint8 = uint(i)fmt.Printf("%b", u)輸出是11111011- 正好是 的 2s 補碼-5。所以在我看來,這個值在內部實際上是使用二進制補碼,但格式是打印無符號5并在前面加上-.有人可以澄清一下嗎?
查看完整描述

3 回答

?
慕娘9325324

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


查看完整回答
反對 回復 2022-01-17
?
qq_笑_17

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


查看完整回答
反對 回復 2022-01-17
?
犯罪嫌疑人X

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


查看完整回答
反對 回復 2022-01-17
  • 3 回答
  • 0 關注
  • 153 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號