任何人都可以帮助我吗?将 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
归档时间: |
|
查看次数: |
17741 次 |
最近记录: |