2017-11-30 4 views
0

誰でも私を助けることができますか?あなたは(int64値として18,446,744,073,709,551,615を保存するために)頼んでいる何plsはgolang 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) 
} 

答えて

1

をINT64するuint64型を変換することは不可能です。

unit64は正の整数を格納し、情報を保持するために64ビットを使用できます。したがって、0から18,446,744,073,709,551,615(2^64-1)の間の任意の正の整数を格納できます。

int64は、1ビットで符号を保持し、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の一意の整数を保持できますが、は、0から始まり、int64値がゼロに跨っています。

符号付き整数として18,446,744,073,709,551,615を保持するには65ビットが必要です。

変換では、基礎となるバイトの情報は失われません。返される整数値の違いは、2つの型が解釈して値を表示する方法によるものです。

uint64は生の整数値を表示しますが、int64two'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

関連する問題