- Почему значение зависит от версии компилятора?
Поведение не определено.
- Каков тогда безопасный способ компилятора перейти от const char * к int64_t и обратно
Несколько неясно, что вы подразумеваете под "переходом от const char * к int64_t". Основываясь на примере, я предполагаю, что вы хотите создать отображение из последовательности символов (не большей длины, чем подходит) в 64-разрядное целое число таким образом, чтобы его можно было преобразовать обратно, используя другой процесс - возможно, скомпилированный другим (версия) компилятор.
Сначала создайте объект int64_t
, инициализируйте его нулем:
int64_t i = 0;
Получить длину строки
auto len = strlen(s);
Проверьте, подходит ли он
assert(len < sizeof i);
Скопируйте байты последовательности символов в целое число
memcpy(&i, s, len);
(Пока у целочисленного типа нет представлений ловушек) Поведение четко определено, и сгенерированное целое число будет одинаковым во всех версиях компилятора, пока порядковый номер процессора (и представление отрицательных чисел) остается неизменным.
Чтение строки символов назад не требует копирования, потому что char
исключительно разрешено использовать псевдонимы всех других типов:
auto back = reinterpret_cast<char*>(&i);
Обратите внимание на квалификацию в последнем разделе. Этот метод не работает, если целое число передается (например, через сеть) процессу, работающему на другом процессоре. Этого также можно добиться с помощью сдвига и маскирования битов, чтобы копировать октеты в определенную позицию значимости с помощью сдвига и маскирования битов.