c - 为什么此代码可以将十六进制转换为十进制

标签 c algorithm decimal hex

此代码会将一个十六进制数字转换为十进制值。

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/

相关文章:

c - 为什么这个指针 Typedef 指向一个结构

c - 为什么这段代码不能正确地对包含数字的行进行排序?

c - 以编程方式查找单词含义并将其打印到文件

java - Java 中的 Floyd Warshall 具有 15000 个顶点的矩阵

Java 将 List 的值映射到 Hashmap

sql-server - SQL 返回月薪而不是年薪并四舍五入到小数点后两位

c - 如何从文本文件中读取单词并添加到字符串数组中?

algorithm - 将旅行商表示为线性表达式

C语言,运行失败,十进制转二进制

c# - 转换为小数点后两位