为什么在C中减去’0’会导致char表示的数字?

有人可以解释为什么这有效吗?

char c = '9'; int x = (int)(c - '0'); 

为什么从char的ascii代码中减去’0’会导致char表示的数字?

因为char都用数字表示,’0’是第一个。

在下表中您会看到:

 '0' => 48 '1' => 49 '9' => 57. 

结果:( '9''0' )=(57 – 48)= 9

在此处输入图像描述 资料来源: http : //www.asciitable.com

char是一个整数类型,就像int和family一样。 char类型的对象具有一些数值。 您在字符文字中键入的字符(如'0' )与char对象所具有的值之间的映射由执行字符集中该字符的编码决定:

  • C ++11§2.14.3:

    包含在执行字符集中可表示的单个c-char的普通字符文字具有char类型,其值等于执行字符集中c-char的编码的数值。

  • C99§6.4.4.4:

    整数字符常量是用单引号括起来的一个或多个多字节字符的序列,如'x'

    […]

    整数字符常量的类型为int

    请注意, int可以转换为char

执行字符集的选择取决于实现。 通常,选择是ASCII兼容的,因此在其他答案中发布的表格具有适当的值。 但是,字符集不需要与ASCII兼容。 但是有一些限制。 其中一个如下(C ++11§2.3,C99§5.2.1):

 abcdefghijklmnopqrstu vwxyz ABCDEFGHIJKLMNOPQRSTU VWXYZ 0 1 2 3 4 5 6 7 8 9 _ { } [ ] # ( ) < > % : ; . ? * + - / ^ & | ~ ! = , \ " ' 

[…]

在源和执行基本字符集中,上述十进制数字列表中0之后的每个字符的值应比前一个值大1。

这意味着无论字符'0'具有什么值,字符'1'值都是'0' ,而字符'2'值比该值多1,依此类推。 数字字符具有连续值。 您可以像这样总结映射:

 Character: 0 1 2 3 4 5 6 7 8 9 Corresponding value: X X+1 X+2 X+3 X+4 X+5 X+6 X+7 X+8 X+9 

所有数字字符都具有从值'0'偏移的值。

这意味着,如果你有一个字符,让我们说'9'并从中减去'0' ,你得到执行字符集中'9'值和'0'值之间的“距离”。 因为它们是连续的,所以距离将是9。

因为C标准保证字符0, 1, 2, 3, 4, 5, 6, 7, 8, 9始终按此顺序关于它们的数字字符代码。 因此,如果从另一个数字中减去char代码'0' ,它将给出相对于0位置,这是它的值……

从C标准,第5.2.1节字符集:

在源和执行基本字符集中,上述小数位数列表中0之后的每个字符的值应大于前一个值的值。

因为,文字是按顺序排列的。

因此,如果0为48,则1将为49,2将为50等。在ASCII中,则x将包含,ascii值为'9'减去ascii值为'0' ,这意味着,ascii值为'9'将是57,因此, x将包含57 - 48 = 9

此外, char是一个整体类型。

数字字符的代码ascii按顺序排列'0' '1' '2' '3' '4' '5' '6' '7' '8' '9' 0”1”2”3”4”5”6”7”8”9 '0' '1' '2' '3' '4' '5' '6' '7' '8' '9'如ascii表所示

因此,如果我们在'9' asii和'0' ascii之间产生差异,我们将获得9

看看ASCII TABLE :

 '9' in ASCII = 57 //in Decimal '0' in ASCII = 48 //in Decimal 

57 – 48 = 9

在ASCII表中,数字按顺序排列,从0的最低代码开始。 如果从0减去更高的数字,则会创建两个ASCII值的差值。 因此, 9值为57 0 48 ,所以如果从57减去48,则得到9.只需查看ASCII表即可。

看这里

第一次尝试:

 cout << (int)'0' << endl; 

现在尝试:

 cout << (int)'9' << endl; 

charictors以文本forms表示数字,但在作为数字时具有不同的值。 Windows使用数字来决定要打印的charictor。 因此,数字0x30表示Windows OS中的charitor 0。 数字0x39代表charictor 9.毕竟,所有计算机都能识别出数字,它不知道“char”是什么。

然而,不幸的是(int)('f' - '0')不等于15。

这将为您提供各种charictors以及用于表示它们的窗口数。 http://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx

如果您需要为另一个操作系统找到它,您可以搜索:Google中的Virtual Key Codes 。 看看其他操作系统的代码是什么。