如何从字符中减去字符“0”将其转换为int?

2022-09-03 04:31:35

此方法适用于 C、C++ 和 Java。我想知道它背后的科学。


答案 1

的值可以是 0-255,其中不同的字符映射到这些值之一。数字也按顺序存储,但它们通常也不存储为前十个值。也就是说,字符的 ASCII 值不是 。的 char 值几乎总是空字符。char'0''9'char'0'00\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将是执行简单数学运算的结果。3520char '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

答案 2

在 C 中,and 运算符将整数提升 *1 应用于其参数,因此减去(或相加)两个 s 的结果是 *2+-charint

从 C 标准:

5.1.2.3 程序执行

[...]

10 示例 2 执行片段时

char c1, c2;
/* ... */
c1 = c1 + c2;

“整数提升”要求抽象机器将每个变量的值提升到大小,然后将两个s [...]intint

将此应用于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


推荐