golang 如何将 uint64 转换为 int64?

TYT*_*YTY 7 go

任何人都可以帮助我吗?将 uint64 转换为 int64 请

//fmt.Println(int64(18446744073709551615)) 
//constant 18446744073709551615 overflows int64 

var x uint64 = 18446744073709551615
var y int64 = int64(x)
fmt.Println(y) //-1 

//just like(c)signed long long
//anyone can help me pls!
//How can I using like this?

// -9223372036854775808 +9223372036854775807

func BytesToInt(b []byte) int {
    bytesBuffer := bytes.NewBuffer(b)
    var tmp int32
    binary.Read(bytesBuffer, binary.BigEndian, &tmp)
    return int(tmp)
}
Run Code Online (Sandbox Code Playgroud)

Pas*_*Kit 10

您所要求的(将 18,446,744,073,709,551,615 作为int64值存储)是不可能的。

Aunit64存储正整数并有 64 位可用于保存信息。因此,它可以存储 0 到 18,446,744,073,709,551,615 (2^64-1) 之间的任何正整数。

Anint64使用一位来保存符号,留下 63 位来保存有关数字的信息。它可以存储 -9,223,372,036,854,775,808 和 +9,223,372,036,854,775,807(-2^63 和 2^63-1)之间的任何值。

两种类型都可以容纳 18,446,744,073,709,551,616 个唯一整数,只是uint64范围从零开始,而int64值跨越零。

将 18,446,744,073,709,551,615 作为有符号整数保存需要 65 位。

在您的转换中,来自底层字节的信息不会丢失。返回的整数值的差异是由于这两种类型解释和显示值的方式造成的。

uint64将显示原始整数值,而int64将使用二进制补码

var x uint64 = 18446744073709551615
var y int64 = int64(x)

fmt.Printf("uint64: %v = %#[1]x, int64: %v = %#x\n", x, y, uint64(y))
// uint64: 18446744073709551615 = 0xffffffffffffffff
// int64:                    -1 = 0xffffffffffffffff


x -= 100
y -= 100
fmt.Printf("uint64: %v = %#[1]x, int64: %v = %#x\n", x, y, uint64(y))
// uint64: 18446744073709551515 = 0xffffffffffffff9b
// int64:                  -101 = 0xffffffffffffff9b 
Run Code Online (Sandbox Code Playgroud)

https://play.golang.com/p/hlWqhnC9Dh