Получение разных результатов при приведении между 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 (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, в которой упоминается это поведение?


person Bart Silverstrim    schedule 23.07.2015    source источник
comment
Если вам нужны 32 бита, используйте int32rand.Int31); если вы хотите 64 бита, используйте int64rand.Int63); если вы хотите использовать 32 или 64 бита в зависимости от вашей архитектуры, используйте intrand.Int). Хотя int похож либо на int32, либо на int64, он всегда отличается от обоих типов. При этом должно быть очевидно, почему int64(rand.Int()) возвращает 32 (на самом деле 31-битных) значения в арке, где int - 32-битное.   -  person Dave C    schedule 23.07.2015
comment
… а также почему ваш вывод int64Random является ложью, если вы на самом деле вызываете rand.Int вместо rand.Int63.   -  person Dave C    schedule 23.07.2015


Ответы (1)


Согласно https://golang.org/doc/go1.1

Язык позволяет реализации выбирать, являются ли типы int и uint 32-битными или 64-битными. Предыдущие реализации Go делали int и uint 32-битными во всех системах. Реализации gc и gccgo теперь делают int и uint 64-битными на 64-битных платформах, таких как AMD64/x86-64.

rand.Int() возвращает целое число. На amd64 будет 64 бита, на ARM будет 32 бита

person RoninDev    schedule 23.07.2015