2 回答

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超3個(gè)贊
也就是說(shuō),我想讀取 float64 寄存器的二進(jìn)制內(nèi)容,就好像它是 int64 值一樣。
嘗試math.Float64bits
:
x := float64(1.2) fmt.Printf("Ans: %x", math.Float64bits(x))
https://play.golang.org/p/QB4jqwJD0f
打印Ans: 3ff3333333333333
。

TA貢獻(xiàn)1786條經(jīng)驗(yàn) 獲得超11個(gè)贊
Go 不允許在不同類(lèi)型的指針之間進(jìn)行轉(zhuǎn)換,因?yàn)樗举|(zhì)上是不安全的。但是,如果您仍然想這樣做,包中有一個(gè)Pointer
類(lèi)型unsafe
,它表示指向任意類(lèi)型的指針。
任何類(lèi)型的指針都可以unsafe.Pointer
轉(zhuǎn)換unsafe.Pointer
為任何類(lèi)型的指針,只要它們具有相同的內(nèi)存結(jié)構(gòu)即可。這允許您忽略類(lèi)型系統(tǒng)并將任何類(lèi)型的數(shù)據(jù)解釋為任何其他類(lèi)型的數(shù)據(jù)。
您在 Go 中的示例中的 C 代碼的確切等效項(xiàng)是:
var y int64 var x float64 = 1.2 y = *(*int64)(unsafe.Pointer(&x))
因此,首先我們轉(zhuǎn)換&x
為unsafe.Pointer
,然后將其轉(zhuǎn)換為*int64
,最后取消引用以得到int64
與 具有相同位結(jié)構(gòu)的x
.
請(qǐng)記住,這是有原因的unsafe
。如果您只想知道這些位是什么,最好使用math.Float64bits()
. 但是,例如,如果您必須使用按位運(yùn)算符,float
那么您當(dāng)然必須將其轉(zhuǎn)換為int
(并返回)。
- 2 回答
- 0 關(guān)注
- 563 瀏覽
添加回答
舉報(bào)