为什么在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
。 看看其他操作系统的代码是什么。