Я пытаюсь понять процесс преобразования шестнадцатеричного числа в его десятичный эквивалент, в частности, при преобразовании каждой шестнадцатеричной цифры в ее десятичное значение.
Скажем, когда цифра i
в hexVal равна любым символам в диапазоне от «0» до «9», ее decVal равняется hexVal, вычтенному из 48, а затем рассчитанному по времени с помощью digitBase:
if ((hexVal[i] >= '0') && (hexVal[i] <= '9')) {
decVal += (hexVal[i] - 48) * digitBase;
...
}
Я понимаю, что 48 - это значение ASCII, равное «0». В чем я сомневаюсь, так это в том, откуда берутся значения 55 и 87, когда цифра i
в hexVal равна диапазонам от «A» до «F» и от «a» до «f»:
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;
}
Любое объяснение будет высоко оценено.
Спасибо.
'0'
. - person Lundin   schedule 20.05.2020'9' - '0'
- person Tony Tannous   schedule 20.05.2020INT_MAX
. Кроме того, код UB. - person chux - Reinstate Monica   schedule 20.05.2020