在Go中转换int和int64时获得不同的输出;是因为处理器体系结构吗?



我用来测试某些预期行为的应用程序的一小部分给出了不同的输出,这取决于我在什么处理器上运行它。下面是代码的相关部分:

   for b := 0; b < intCounter; b++ {
            //int64Random = rand.Int63()
            int64Random = int64(rand.Int())
//CHECKING FOR SANITY
fmt.Println("int64Random is " + strconv.FormatInt(int64Random, 10))
            slcTestNums = append(slcTestNums, int64Random)
    }

当我在Mac (amd64, darwin)上运行此命令时,我得到如下输出:

int64Random is 2991558990735723489
int64Random is 7893058381743103687
int64Random is 7672635040537837613
int64Random is 1557718564618710869
int64Random is 2107352926413218802

当我在Pi (arm, linux)上运行此命令时,我得到如下输出:

int64Random is 1251459732
int64Random is 1316852782
int64Random is 971786136
int64Random is 1359359453
int64Random is 729066469

如果在Pi上将int64Random更改为= rand.Int63()并重新编译,则得到如下输出:

int64Random is 7160249008355881289
int64Random is 7184347289772016444
int64Random is 9201664581141930074
int64Random is 917219239600463359
int64Random is 6015348270214295654

…这与Mac得到的更接近。这是因为由于处理器架构在运行时发生了变化吗?为什么int64(rand.Int())生成的是int64范围的数字,而不是保持一个int64范围的数字,而是改变存储它的变量的类型?我错过了提到这种行为的Go文档吗?

根据https://golang.org/doc/go1.1

语言允许实现选择是否为int类型而int类型是32位或64位。以前的Go实现是int在所有系统上都是32位。gc和gccgo实现现在在64位平台(如AMD64/x86-64)上使用int和uint 64位

rand.Int()返回int。在amd64上是64位,在ARM上是32位

最新更新