如何从字符中减去字符“0”将其转换为int?
此方法适用于 C、C++ 和 Java。我想知道它背后的科学。
的值可以是 0-255,其中不同的字符映射到这些值之一。数字也按顺序存储,但它们通常也不存储为前十个值。也就是说,字符的 ASCII 值不是 。的 char 值几乎总是空字符。char
'0'
'9'
char
'0'
0
0
\0
在不了解有关 ASCII 的任何其他信息的情况下,从任何其他数字字符中减去一个字符如何生成原始字符的 char 值非常简单。'0'
所以,这是简单的数学:
'0' - '0' = 0 // Char value of character 0 minus char value of character 0
// In ASCII, that is equivalent to this:
48 - 48 = 0 // '0' has a value of 48 on ASCII chart
所以,同样,我可以用任何一个数数来做整数数学运算......char
(('3' - '0') + ('5' - '0') - ('2' - '0')) + '0') = '6'
ASCII 图表上 、 或 和 之间的差异正好等于我们通常看到该数字时想到的面值。从每个中减去,将它们加在一起,然后在末尾添加一个背面,将得到一个char值,该值表示char,该char将是执行简单数学运算的结果。3
5
2
0
char '0'
'0'
上面的代码片段模拟 ,但在 ASCII 中,它实际上是这样做的:3 + 5 - 2
((51 - 48) + (53 - 48) - (50 - 48)) + 48) = 54
因为在 ASCII 图表上:
0 = 48
2 = 50
3 = 51
5 = 53
6 = 54
在 C 中,and 运算符将整数提升 *1 应用于其参数,因此减去(或相加)两个 s 的结果是 *2。+
-
char
int
从 C 标准:
5.1.2.3 程序执行
[...]
10 示例 2 执行片段时
char c1, c2; /* ... */ c1 = c1 + c2;
“整数提升”要求抽象机器将每个变量的值提升到大小,然后将两个s [...]
int
int
将此应用于OP的隐式给定用例
char c = 42;
... = c - `0`;
这将导致上述内容与以下内容相同:
... = (int) c - (int) `0`; /* The second cast is redundant, as per Jens' comment. */
^ ^
+------ int -----+
*1:如果运算符参数的秩低于 int
,则会将其提升为 int
。
*2:char
的秩低于 int
。