【问题标题】:Why do these two golang integer conversion functions give different results?为什么这两个golang整数转换函数会给出不同的结果?
【发布时间】:2014-07-12 06:18:41
【问题描述】:

我写了一个函数来将字节切片转换为整数。

我创建的函数实际上是一个基于循环的实现 Rob Pike 在这里发表的内容:

http://commandcenter.blogspot.com/2012/04/byte-order-fallacy.html

这是 Rob 的代码:

i = (data[0]<<0) | (data[1]<<8) | (data[2]<<16) | (data[3]<<24);

我的第一个实现(操场上的 toInt2)不起作用 我期待,因为它似乎将 int 值初始化为 uint。 这看起来很奇怪,但它必须是特定于平台的,因为 go playground 报告的结果与我的机器(mac)不同。

谁能解释为什么这些函数在我的 mac 上表现不同?

这里是带有代码的游乐场的链接:http://play.golang.org/p/FObvS3W4UD

这是来自操场的代码(为方便起见):

/*

Output on my machine:

    amd64 darwin go1.3 input: [255 255 255 255]
    -1
    4294967295

Output on the go playground:

    amd64p32 nacl go1.3 input: [255 255 255 255]
    -1
    -1

*/

package main

import (
    "fmt"
    "runtime"
)

func main() {
    input := []byte{255, 255, 255, 255}
    fmt.Println(runtime.GOARCH, runtime.GOOS, runtime.Version(), "input:", input)
    fmt.Println(toInt(input))
    fmt.Println(toInt2(input))
}

func toInt(bytes []byte) int {
    var value int32 = 0 // initialized with int32

    for i, b := range bytes {
        value |= int32(b) << uint(i*8)
    }
    return int(value) // converted to int
}

func toInt2(bytes []byte) int {
    var value int = 0 // initialized with plain old int

    for i, b := range bytes {
        value |= int(b) << uint(i*8)
    }
    return value
}

【问题讨论】:

    标签: go int


    【解决方案1】:

    这是一个有根据的猜测,但int 类型可以是 64 位或 32 位,具体取决于平台,在我的系统和你的系统上它是 64 位,因为操场在 nacl 上运行,它是 32 位。

    如果您将第二个函数更改为使用 uint,它将正常工作。

    来自spec

    uint     either 32 or 64 bits 
    int      same size as uint
    uintptr  an unsigned integer large enough to store the uninterpreted bits of a pointer value
    

    【讨论】:

      【解决方案2】:

      int 允许为 32 位或 64 位,具体取决于平台/实现。当它是 64 位时,它能够将 2^32 表示为有符号正整数,这就是您的机器上发生的情况。当它是 32 位(操场)时,它会如您所愿地溢出。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-05-07
        • 2012-09-27
        • 1970-01-01
        • 1970-01-01
        • 2015-11-16
        • 2023-03-22
        • 1970-01-01
        • 2017-01-11
        相关资源
        最近更新 更多