此代码会将一个十六进制数字转换为十进制值。
int value;
// ch is a char variable holding a hexadecimal digit
if (isxdigit(ch))
if (isdigit(ch))
value = ch - '0';
else
value = tolower(ch) - 'a' + 10;
else
fprintf(stderr, "%c is not a valid hex digit", ch);
虽然我不完全理解它是如何工作的。我可以看到根据它是数字还是字母,从 char 变量中减去不同的东西。我能理解数字转换的部分,但我不明白为什么当字符是字母时必须将 10 添加到值中。
最佳答案
tolower(ch) - 'a'
的减法会将字符映射到字母 a..f 范围 0..5 中的数字。但是,十六进制数字 a16 的(十进制)值是 1010,因此要将范围移回到需要的 10..15,10已添加。
也许这有帮助:
+---------+------------+-----------------+-------------+
Character | Subtracted | Resulting value | Digit value |
+---------+------------+-----------------+-------------+
| '0' | '0' | 0 | 0 |
| '1' | '0' | 1 | 1 |
| '2' | '0' | 2 | 2 |
| '3' | '0' | 3 | 3 |
| '4' | '0' | 4 | 4 |
| '5' | '0' | 5 | 5 |
| '6' | '0' | 6 | 6 |
| '7' | '0' | 7 | 7 |
| '8' | '0' | 8 | 8 |
| '9' | '0' | 9 | 9 |
| 'a' | 'a' | 0 | 10 |
| 'b' | 'a' | 1 | 11 |
| 'c' | 'a' | 2 | 12 |
| 'd' | 'a' | 3 | 13 |
| 'e' | 'a' | 4 | 14 |
| 'f' | 'a' | 5 | 15 |
+---------+------------+-----------------+-------------+
请注意“结果值”列如何在“a”处重置回 0,根据最终的“数字值”列,这不是它需要的位置,它以十进制显示每个十六进制数字的值。
关于c - 为什么此代码可以将十六进制转换为十进制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5089701/