Небольшая часть приложения, которое я использую для проверки некоторого ожидаемого поведения, дает разные результаты в зависимости от того, на каком процессоре я его запускаю. Вот соответствующая часть кода:
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 вместо сохранения числа с диапазоном int, но меняет тип переменной, в которой он хранится? Я пропустил документацию Go, в которой упоминается это поведение?
int32
(иrand.Int31
); если вы хотите 64 бита, используйтеint64
(иrand.Int63
); если вы хотите использовать 32 или 64 бита в зависимости от вашей архитектуры, используйтеint
(иrand.Int
). Хотяint
похож либо наint32
, либо наint64
, он всегда отличается от обоих типов. При этом должно быть очевидно, почемуint64(rand.Int())
возвращает 32 (на самом деле 31-битных) значения в арке, где int - 32-битное. - person Dave C   schedule 23.07.2015rand.Int
вместоrand.Int63
. - person Dave C   schedule 23.07.2015