【问题标题】:golang how can I convert uint64 to int64? [duplicate]golang如何将uint64转换为int64? [复制]
【发布时间】:2017-11-30 16:38:29
【问题描述】:

有人可以帮助我吗?请将 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)
}

【问题讨论】:

    标签: go


    【解决方案1】:

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

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-13
      • 2023-03-31
      • 1970-01-01
      • 2014-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-04
      相关资源
      最近更新 更多