Например:Как перенести значение int64 в беззнаковое пространство int64 без изменения порядка?
- INT64_MIN до 0
- 0 до INT64_MAX + 1
- INT64_MAX в UINT64_MAX
Ниже мой код:
uint64_t int64ToUint64(int64_t value)
{
uint64_t uvalue = value - std::numeric_limits<int64_t>::min();
return uvalue;
}
Он работает, но существует знаковое целочисленное переполнение, а для каждого стандарта C++ целочисленное переполнение целых чисел - это поведение undefin редактор Любые другие решения без полного переполнения?
Насколько он вам нужен? Я уверен, что «подписанное переполнение» не определено по двум причинам: 1. Риск переполнения ловушек (в большинстве случаев это не проблема), 2. Дополнение дополняет друг друга -> наличие/отсутствие отрицательного нуля -> неопределенность какой битовой диаграммы приводит к тому, что значение. Если вас интересуют только «обычные» процессоры, такие как x86, ARM, 68K, 29K, MIPS, я бы сказал, что это «безопасно» (если MIPS сказано не генерировать переполненные ловушки) –
@MatsPetersson на самом деле мы только на x86 RHEL6. Просто любопытно, есть ли лучшее решение. – bydsky
Я не уверен, есть ли определенное решение. Возможно, преобразование в unsigned сначала, а затем вычитание смещения в качестве значения без знака было бы более надежным (но я не уверен, что это хорошо определено для значений, которые находятся за пределами 0..INT64_MAX. –