2015-07-23 1 views
0

Небольшая часть приложения, которое я использую для проверки ожидаемого поведения, дает разные результаты, в зависимости от того, на каком процессоре я запускаю его. Вот соответствующая часть кода:Получение различного вывода при литье между 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, которая упоминает это поведение?

+1

Если вы хотите, чтобы 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 бит. –

+1

... а также почему ваш вывод «int64Random» является ложью, если вы на самом деле вызываете 'rand.Int' вместо' rand.Int63'. –

ответ

1

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

на языке позволяет реализации выбрать, будет ли тип INT и UINT типы 32 или 64 бита. Предыдущие реализации реализации сделали int и uint 32 бит на всех системах. Обе реализации ГЦ и gccgo теперь делают Int и UINT 64 бит на 64-битных платформах, таких как AMD64/x86-64

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

Смежные вопросы