【发布时间】:2020-09-06 21:15:09
【问题描述】:
我正在尝试了解将十六进制数转换为其十进制等效值的过程,尤其是在将每个十六进制数字转换为其十进制值时。
假设当hexVal的数字i等于'0'到'9'之间的任何字符时,它的decVal等于hexVal减去48然后由digitBase计时:
if ((hexVal[i] >= '0') && (hexVal[i] <= '9')) {
decVal += (hexVal[i] - 48) * digitBase;
...
}
我知道 48 是 '0' 的 ASCII 值。
我怀疑的是,当 hexVal 的数字 i 等于“A”到“F”和“a”到“f”的范围时,值 55 和 87 的来源:
else if ((hexVal[i] >= 'A') && (hexVal[i] <= 'F')) {
hexToDec += (hexVal[i] - 55) * digitBase;
...
}
和
else if ((hexVal[i] >= 'a') && (hexVal[i] <= 'f')) {
hexToDec += (hexVal[i] - 87) * digitBase;
...
}
上面的代码块是从以下函数中提取的,该函数可以很好地将十六进制数转换为等效的十进制数。
int conv_hex_to_dec(char hexVal[]) {
int hexToDec = 0;
int len = strlen(hexVal);
int digitBase = 1;
// Extract hex characters as digits from last character
for (int i = len - 1; i >= 0; i--) {
if ((hexVal[i] >= '0') && (hexVal[i] <= '9')) {
hexToDec += (hexVal[i] - 48) * digitBase;
digitBase = digitBase * 16;
}
else if ((hexVal[i] >= 'A') && (hexVal[i] <= 'F')) {
hexToDec += (hexVal[i] - 55) * digitBase;
digitBase = digitBase * 16;
}
else if ((hexVal[i] >= 'a') && (hexVal[i] <= 'f')) {
hexToDec += (hexVal[i] - 87) * digitBase;
digitBase = digitBase * 16;
}
else {
printf("Invalid hex val");
}
}
return hexToDec;
}
任何解释将不胜感激。
谢谢。
【问题讨论】:
-
asciitable.com 这就是为什么我们不应该使用幻数 48 而是输入
'0'。 -
这是十六进制表示转换为int的字符串。减去 ascii 值得到一个字符的实际十进制值。即 9 是
'9' - '0'的 ascii 值 -
"以下函数可以很好地将十六进制数转换为等效的十进制数" ---> 仅限于
INT_MAX。除此之外,代码是UB。
标签: c numbers hex decimal base