2016-06-08 206 views
1

我想将float64数字转换为int64数字。也就是说,我想读取float64寄存器的二进制内容,就好像它是一个int64值。我的意思是,我希望下面的C代码相当于将一个指针转换为golang中的另一个类型

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) 

} 
+1

直接将它转换为int64是不够的? 'y:= int64(x)' –

+0

相关,你也可以回答你的问题:[把字节切成小/大端符号整数还是浮点数?](http://stackoverflow.com/questions/34701187/go-byte -to-小大端签名整数-或浮动) – icza

回答

5

也就是说,我想读的二进制内容float64作为 注册,如果它是一个Int64值。

尝试math.Float64bits

x := float64(1.2) 
fmt.Printf("Ans: %x", math.Float64bits(x)) 

https://play.golang.org/p/QB4jqwJD0f

打印Ans: 3ff3333333333333

0

Go不允许在不同类型的指针之间进行转换,因为它本质上是不安全的。但是,如果你仍然想要这样做,unsafe包中有Pointer类型,它表示指向任意类型的指针。

任何类型的指针都可以转换为unsafe.Pointer,并且unsafe.Pointer只要具有相同的内存结构就可以转换为任何类型的指针。这允许您忽略类型系统并将任何类型的数据解释为任何其他类型的数据。

在转到您的例子C代码的完全等效是:

var y int64 
var x float64 = 1.2 
y = *(*int64)(unsafe.Pointer(&x)) 

所以首先我们转换&xunsafe.Pointer,然后再转换到*int64终于提领,要得到与同一个int64位结构为x

请记住,这是unsafe包中的原因。如果您只想知道这些位是什么,最好使用math.Float64bits()。但是,例如,如果您必须在float上使用按位运算符,那么当然必须将其转换为int(并返回)。

相关问题