Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么这两个golang整数转换函数给出不同的结果?_Go_Int - Fatal编程技术网

为什么这两个golang整数转换函数给出不同的结果?

为什么这两个golang整数转换函数给出不同的结果?,go,int,Go,Int,我编写了一个函数将字节片转换为整数 我创建的函数实际上是一个基于循环的 罗布·派克在这里发表的文章: 这是罗布的密码: i = (data[0]<<0) | (data[1]<<8) | (data[2]<<16) | (data[3]<<24); i=(数据[0]int允许为32或64位,具体取决于平台/实现。当它为64位时,它能够将2^32表示为有符号正整数,这是您机器上发生的情况。当它为32位时(操场),它会像您期望的那样溢出。int允许

我编写了一个函数将字节片转换为整数

我创建的函数实际上是一个基于循环的 罗布·派克在这里发表的文章:

这是罗布的密码:

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

i=(数据[0]
int
允许为32或64位,具体取决于平台/实现。当它为64位时,它能够将
2^32
表示为有符号正整数,这是您机器上发生的情况。当它为32位时(操场),它会像您期望的那样溢出。

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

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

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

从:


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

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

从:

/*

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