int型数据的范围是 [-2^31, 2^31-1],其中[0, 2^31-1]对应的16进制数存储方式为00000000 - 7fffffff [-2^31, -1]对应的16进制数存储方式为80000000 - ffffffff,因此可以给负数加上2^32,将负数映射到[2^31, 2^32-1]区间,再进行转换。
如何理解呢?
原码的排序应该是 [-2^31, 2^31-1],但计算机使用补码存储数据,实际的排序应该是 0 ~ (2^31-1) ~ (-2^31) ~ (-1)
[-2^31, 2^31-1]数据在计算机中以补码存储,如下
00000000 00000000 00000000 00000000(0)
00000000 00000000 00000000 00000001(1)
00000000 00000000 00000000 00000010(2)
00000000 00000000 00000000 00000011(3)
......
01111111 11111111 11111111 11111111(2^31-1)
10000000 00000000 00000000 00000000(-2^31)
10000000 00000000 00000000 00000001(-2^31-1)
......
11111111 11111111 11111111 11111101(-3)
11111111 11111111 11111111 11111110(-2)
11111111 11111111 11111111 11111111(-1)
实测代码:
class Solution {
public:
string toHex(int num) {
string ans;
string hash("0123456789abcdef");
long long n=num<0?num+(1ll<<32):num;
if(n==0)
return "0";
while(n)
{
ans=hash[n%16]+ans;
n/=16;
}
return ans;
}
};