如何在不更改顺序的情况下将int64值转换为unsigned int64空间?

时间:2013-12-05 08:40:00

标签: c++ casting unsigned-integer

例如:

  1. INT64_MIN为0
  2. 0到INT64_MAX + 1
  3. INT64_MAX到UINT64_MAX
  4. 以下是我的代码:

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

    它可以工作,但是有符号整数溢出,并且根据C ++标准,有符号整数溢出是未定义的行为。没有整数溢出的任何其他解决方案?

2 个答案:

答案 0 :(得分:3)

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

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

    uvalue += INT64_MAX;
    uvalue += 1;

    return uvalue;
}

答案 1 :(得分:-2)

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));
}