我想将float64号转换为int64号。也就是说,我想读取float64寄存器的二进制内容,就好像它是int64值一样。我的意思是,我想要等同于以下C代码
long y;
float x = 1.2;
y = * ( long * ) &x;
我该怎么做?
这是我尝试的无效。
package main
import (
"fmt"
)
func main() {
x := float64(1.2)
y := *((*int64)(&x))
fmt.Println("Ans: ", y)
}
答案 0 :(得分:5)
也就是说,我想读取float64寄存器的二进制内容 如果它是int64值。
尝试math.Float64bits
:
x := float64(1.2)
fmt.Printf("Ans: %x", math.Float64bits(x))
https://play.golang.org/p/QB4jqwJD0f
打印Ans: 3ff3333333333333
。
答案 1 :(得分:1)
Go不允许在不同类型的指针之间进行转换,因为它本质上是不安全的。但是,如果你仍然想要这样做,Pointer
包中有一个unsafe
类型,它代表一个指向任意类型的指针。
任何类型的指针都可以转换为unsafe.Pointer
,unsafe.Pointer
可以转换为任何类型的指针,只要它们具有相同的内存结构即可。这允许您忽略类型系统并将任何类型的数据解释为任何其他类型的数据。
Go中示例中C代码的完全等价物如下:
var y int64
var x float64 = 1.2
y = *(*int64)(unsafe.Pointer(&x))
首先,我们将&x
转换为unsafe.Pointer
,然后将其转换为*int64
,最后取消引用,以获得与{{1}具有相同位结构的int64
}。
请记住,这是x
包中存在的原因。如果您只是想知道这些位是什么,最好使用unsafe
。但是,例如,如果您必须在math.Float64bits()
上使用按位运算符,那么您当然必须将其转换为float
(并返回)。