Небольшая часть приложения, которое я использую для проверки ожидаемого поведения, дает разные результаты, в зависимости от того, на каком процессоре я запускаю его. Вот соответствующая часть кода:Получение различного вывода при литье между int и int64 в Go; это из-за архитектуры процессора?
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 (рука, 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, вместо того, чтобы хранить число с расширенным номером, но изменяя тип переменной, в которой он хранится? Мне не хватает документации Go, которая упоминает это поведение?
Если вы хотите, чтобы 32 бита использовали 'int32' (и' rand.Int31'); если вы хотите, чтобы 64 бита использовали 'int64' (и' rand.Int63'); если вы хотите использовать 32 или 64 бита как «подходящие» для вашей архитектуры, тогда используйте 'int' (и' rand.Int'). Хотя 'int' is * like * либо' int32', либо 'int64', он всегда отличается от обоих. При этом должно быть очевидно, почему 'int64 (rand.Int())' возвращает 32 (фактически 31 бит) значения в арке, где int 32 бит. –
... а также почему ваш вывод «int64Random» является ложью, если вы на самом деле вызываете 'rand.Int' вместо' rand.Int63'. –