【问题标题】:Convert one pointer to another type in golang在golang中将一个指针转换为另一种类型
【发布时间】:2016-10-08 06:40:06
【问题描述】:

我想将 float64 数字转换为 int64 数字。也就是说,我想读取 float64 寄存器的二进制内容,就好像它是 int64 值一样。我的意思是,我想要以下 C 代码的 go 等效项

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)

}

【问题讨论】:

标签: pointers go


【解决方案1】:

也就是说,我想读取 float64 寄存器的二进制内容为 如果是 int64 值。

试试math.Float64bits

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

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

打印Ans: 3ff3333333333333

【讨论】:

    【解决方案2】:

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

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

    与您在 Go 中的示例中的 C 代码完全相同的是:

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

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

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

    【讨论】:

      猜你喜欢
      • 2020-12-14
      • 1970-01-01
      • 2010-10-08
      • 2012-03-14
      • 2023-02-07
      • 2012-03-28
      相关资源
      最近更新 更多