为了账号安全,请及时绑定邮箱和手机立即绑定

在golang中将一个指针转换为另一种类型

在golang中将一个指针转换为另一种类型

Go
慕尼黑的夜晚无繁华 2022-01-17 16:39:18
我想将 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


查看完整回答
反对 回复 2022-01-17
?
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))

因此,首先我们转换&xunsafe.Pointer,然后将其转换为*int64,最后取消引用以得到int64与 具有相同位结构的x.

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


查看完整回答
反对 回复 2022-01-17
  • 2 回答
  • 0 关注
  • 570 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号