我想将 float64 数字转换为 int64 数字。也就是说,我想读取 float64 寄存器的二进制内容,就好像它是 int64 值一样。我的意思是,我想要以下 C 代码的 go 等价物long y;float x = 1.2;y = * ( long * ) &x;我怎么做?这是我的尝试,但不起作用。package mainimport ( "fmt")func main() { x := float64(1.2) y := *((*int64)(&x)) fmt.Println("Ans: ", y)}
2 回答

DIEA
TA贡献1820条经验 获得超3个赞
也就是说,我想读取 float64 寄存器的二进制内容,就好像它是 int64 值一样。
尝试math.Float64bits
:
x := float64(1.2) fmt.Printf("Ans: %x", math.Float64bits(x))
https://play.golang.org/p/QB4jqwJD0f
打印Ans: 3ff3333333333333
。

Qyouu
TA贡献1786条经验 获得超11个赞
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
,最后取消引用以得到int64
与 具有相同位结构的x
.
请记住,这是有原因的unsafe
。如果您只想知道这些位是什么,最好使用math.Float64bits()
. 但是,例如,如果您必须使用按位运算符,float
那么您当然必须将其转换为int
(并返回)。
- 2 回答
- 0 关注
- 570 浏览
添加回答
举报
0/150
提交
取消