题目出处:力扣https://leetcode-cn.com/problems/convert-a-number-to-hexadecimal/
方法1:求解过程中转换为long,求解完成后转换为unsigned int
class Solution {
public:
string toHex(int num) {
if(num == 0){
return "0";
}
unsigned int _num = num;
if(num < 0){
_num = ((long)pow(2, 32) + _num);
}
string ans = "";
unsigned int yu = 0;
while(_num != 0){
yu = _num % 16;
_num /= 16;
if(yu >= 0 && yu <= 9){
ans += yu + '0';
}
else{
ans += yu - 10 + 'a';
}
}
reverse(ans.begin(), ans.end());
return ans;
}
};
方法2:全部用long类型计算
class Solution {
public:
string toHex(int num) {
if(num == 0){
return "0";
}
long _num = num;
if(num < 0){
_num = (long)(pow(2, 32) + _num);
}
string ans = "";
long yu = 0;
while(_num != 0){
yu = _num % 16;
_num /= 16;
if(yu >= 0 && yu <= 9){
ans += yu + '0';
}
else{
ans += yu - 10 + 'a';
}
}
reverse(ans.begin(), ans.end());
return ans;
}
};
负数补码的处理:unsigned形的大整数来表示signed的负整数,
8位int中-1
表示为0b11111111(T)
,无符号整数0b11111111(U)
表示为2^8 - 1,两者相差2^8。
8位int中-2
表示为0b11111110(T)
,无符号整数0b11111110(U)
表示为2^8 - 2,两者相差2^8。
因此在32位int中两者相差2^32