Как переместить значение int64 в беззнаковое пространство int64 без изменения порядка?

Например:

  1. INT64_MIN в 0
  2. От 0 до INT64_MAX + 1
  3. От INT64_MAX до UINT64_MAX

Ниже мой код:

uint64_t int64ToUint64(int64_t value)
{
uint64_t uvalue = value - std::numeric_limits<int64_t>::min();
return uvalue;
}

Это работает, но существует целочисленное переполнение со знаком, и в соответствии со стандартом C ++ целочисленное переполнение со знаком является поведением неопределенным. Любые другие решения без целочисленного переполнения?

1

Решение

Поскольку преобразование из типов со знаком в беззнаковый хорошо определено, а переполнение арифметики без знака невозможно, вы можете безопасно делать все, что хотите, сначала преобразовав значение со знаком в тип без знака:

uint64_t int64ToUint64(int64_t value)
{
uint64_t uvalue = value;

uvalue += INT64_MAX;
uvalue += 1;

return uvalue;
}
3

Другие решения

uint64_t int64ToUint64(int64_t value){
uint64_t res = *(reinterpret_cast<uint64_t*>(&value));
return res ^ numeric_limits<int64_t>::min();
}
int64_t uint64ToInt64(uint64_t value){
value ^= numeric_limits<int64_t>::min();
return *(reinterpret_cast<int64_t*>(&value));
}
-2

По вопросам рекламы [email protected]