来自同一Go程序的不同输出

时间:2014-11-09 15:01:56

标签: go

以下是我的Go代码:http://play.golang.org/p/CDUagFZ-rk

package main

import "fmt"

func main() {
    var max int = 0
    for i := 0; i < 1000000; i++ {
        var len int = GetCollatzSeqLen(i)
        if len > max {
            max = len
        }
    }

    fmt.Println(max)

}

func GetCollatzSeqLen(n int) int {
    var len int = 1
    for n > 1 {
        len++
        if n%2 == 0 {
            n = n / 2
        } else {
            n = 3*n + 1
        }
    }
    return len

}

在我的本地机器上,当我运行程序时,我得到525作为输出。当我在Go Playground上运行时,输出为476.

我想知道有什么不同。

1 个答案:

答案 0 :(得分:5)

由于特定于实现的大小int,32位或64位。使用int64获得一致的结果。例如,

package main

import "fmt"

func main() {
    var max int64 = 0
    for i := int64(0); i < 1000000; i++ {
        var len int64 = GetCollatzSeqLen(i)
        if len > max {
            max = len
        }
    }

    fmt.Println(max)

}

func GetCollatzSeqLen(n int64) int64 {
    var len int64 = 1
    for n > 1 {
        len++
        if n%2 == 0 {
            n = n / 2
        } else {
            n = 3*n + 1
        }
    }
    return len

}

输出:

525

游乐场:http://play.golang.org/p/0Cdic16edP


  

The Go Programming Language Specification

     

Numeric types

 int32       the set of all signed 32-bit integers (-2147483648 to 2147483647)
 int64       the set of all signed 64-bit integers (-9223372036854775808 to 9223372036854775807) 
     

n位整数的值是n位宽并使用表示   二进制补码算法。

     

还有一组预先声明的数字类型   特定于实现的大小:

 uint     either 32 or 64 bits
 int      same size as uint 

要查看int的特定于实现的大小,请运行此程序。

package main

import (
    "fmt"
    "runtime"
    "strconv"
)

func main() {
    fmt.Println(
        "For "+runtime.GOARCH+" the implementation-specific size of int is",
        strconv.IntSize, "bits.",
    )
}

输出:

For amd64 the implementation-specific size of int is 64 bits.

On Go Playground:http://play.golang.org/p/7O6dEdgDNd

For amd64p32 the implementation-specific size of int is 32 bits.