在Golang中将负整数转换为二进制

5

如何使用二进制补码表示Go中的负整数?
例如:

n := int64(-1)
fmt.Printf("%b", n)
fmt.Println(strconv.FormatInt(n, 2))

两行代码均输出-1,结果应该像ffffffffffffffff这样。
2个回答

3

很抱歉,您是否意味着您想探索 int64 值在内存中的存储方式?您需要使用 unsafe 包来强制重新解释 Go 语言中的值。

下面的代码实现了您想要的功能:

package main

import (
    "fmt"
    "unsafe"
)

func main() {
    a := int64(-1)
    fmt.Printf("%x\n", *(*[8]byte)(unsafe.Pointer(&a)))
}

哇!看起来它正在工作,但是...难道没有其他语言中更花哨的方法吗? :) - Radoslav Stoyanov
Golang是一种类型安全的语言,这意味着它不允许您将值解释为不兼容的类型(例如int64转换为原始字节),而在“其他语言”(如C)中则不是这种情况。如果您确实需要这样做,您将不得不使用unsafe包来规避此保护。 - Eternal_flame-AD
2
不要使用unsafe包来处理这个问题,只需按照标记的重复项中所示将其转换为无符号整数即可。仅在确实有必要时才使用unsafe,并且只作为最后的手段。 - icza

0

我还编写了一个函数,用于以编程方式计算int64的二进制补码表示,以防您只想计算该值:

package main

import (
    "fmt"
    "math/big"
)

func main() {
    a := int64(-1)
    fmt.Printf("%x\n", TwoComplement(a))
}

func TwoComplement(val int64) []byte {
    n := big.NewInt(val)

    var r []byte
    if n.Cmp(big.NewInt(0)) != -1 {
        r = n.Bytes()
    } else {
        mask := big.NewInt(1)
        mask.Lsh(mask, 64)

        r = n.Add(n, mask).Bytes()
    }

    res := bytes.NewBuffer([]byte{})
    for i := 0; i < 8-len(r); i++ {
        res.WriteByte(0)
    }
    res.Write(r)
    return res.Bytes()
}

你也可以使用按位非运算符并加1 ^bits+1 - Kenpachi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接