如何在不改变顺序的情况下将int64值移位到无符号int64空间

How to shift int64 value to unsigned int64 space without changing the order?

本文关键字:int64 空间 无符号 情况下 改变 顺序      更新时间:2023-10-16

例如:

  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++标准,有符号整数溢流是未定义的行为。还有其他没有整数溢出的解决方案吗?

由于从有符号类型到无符号类型的转换定义良好,并且无符号算术没有溢出,因此可以通过首先将有符号值转换为无符号类型来安全地执行所需操作:

uint64_t int64ToUint64(int64_t value)
{
    uint64_t uvalue = value;
    uvalue += INT64_MAX;
    uvalue += 1;
    return uvalue;
}
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));
}