将有符号整数范围映射到无符号

时间:2015-07-03 09:54:56

标签: c++ c++11 integer int

我遇到一个问题,应该将有符号整数转换为无符号整数,保留其范围和顺序。

给出以下定义:

#include <limits>

#define MIN(X) std::numeric_limits<X>::min();
#define MAX(X) std::numeric_limits<X>::max();

将签名范围 [MIN(T),MAX(T)] 映射到无符号范围 [0,MAX(U)]

其中:

  

T是有符号整数类型

     

U是无符号整数类型

     

sizeof(T)== sizeof(U)

我尝试了各种比特和数字方法来提出解决方案,但没有成功。

1 个答案:

答案 0 :(得分:6)

unsigned int signedToUnsigned(signed int s) {
  unsigned int u =  1U + std::numeric_limits<int>::max();
  u += s;
  return u;
}

Live example here

这会将signed_max + 1添加到signed int,以确保[MIN(int), MAX(int)]映射到[0, MAX(unsigned int)]

为什么这个答案会正常工作并正确映射:

将有符号整数添加到无符号时,带符号的数字将提升为无符号类型。从第4.7节[conv.integral]

  

如果目标类型是无符号的,则结果值最小   无符号整数与源整数一致(模2 n   其中n是用于表示无符号类型的位数)。 [   注意:在二进制补码表示中,此转换为   概念性,位模式没有变化(如果没有   截断)。 - 后注]