为什么这两个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