golang如何将uint64转换为int64?

时间:2017-11-30 04:42:23

标签: go

谁能帮帮我?将uint64转换为int64 pls

//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)
}

1 个答案:

答案 0 :(得分:2)

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

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

int64使用一位来保持符号,留下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将使用two's complement

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 

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