如何从char中减去字符'0'将其更改为int?

时间:2013-12-21 14:48:56

标签: java c++ c char int

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

4 个答案:

答案 0 :(得分:23)

char的值可以是0-255,其中不同的字符映射到这些值之一。数字也按'0''9'的顺序存储,但它们通常也不会存储为前十个char值。也就是说,字符'0'的ASCII值不是00的char值几乎总是\0 null字符。

在不了解ASCII的任何其他内容的情况下,如何从任何其他数字字符中减去'0'字符将导致原始字符的char值非常简单。

所以,这是简单的数学:

'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图表上的3520之间的差异与我们在看到数字时通常会想到的面值完全相同数字。从每个中减去char '0',将它们加在一起,然后在最后添加'0'将给我们一个char值,表示执行该简单数学运算的结果的char。

上面的代码片段模拟3 + 5 - 2,但在ASCII中,它实际上是这样做的:

((51 - 48) + (53 - 48) - (50 - 48)) + 48) = 54

因为在ASCII图表上:

0 = 48
2 = 50
3 = 51
5 = 53
6 = 54

答案 1 :(得分:4)

在C中,+-运算符将整数提升 * 1 应用于它们的参数,从而减去(或添加)两个char s的结果是int * 2

来自C标准:

  

5.1.2.3程序执行

     

[...]

     

10示例2执行片段

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

'整数促销''要求抽象机器将每个变量的值提升为int大小,然后添加两个int s [...]

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

答案 2 :(得分:2)

没有变化'0' 是C 中的int。编写48(假设为ASCII)是一种奇特的方式。

您可以通过计算'0'

的大小来说服自己
  printf ("sizeof '0'   is %zu\n", sizeof '0');
  printf ("sizeof(char) is %zu\n", sizeof(char));

在第一行很可能会打印4(或2),但可能不会像第二行那样打印(再次:在C中;对于C ++来说是不同的。)

答案 3 :(得分:0)

没有任何限定条件的数字常量0的类型为int。由于通常的类型提升过程,charint上的二进制减法操作的结果也具有类型int

相关问题