我知道要将任何给定的 char 转换为 int,此代码是可能的 [除了 atoi()]:
int i = '2' - '0';
但我从来不明白它是如何工作的,'0' 的意义是什么,我似乎没有在网上找到任何解释。
提前致谢!!
我知道要将任何给定的 char 转换为 int,此代码是可能的 [除了 atoi()]:
int i = '2' - '0';
但我从来不明白它是如何工作的,'0' 的意义是什么,我似乎没有在网上找到任何解释。
提前致谢!!
C 中的所有字符都用一个整数值表示,即字符的 ASCII 码。例如'0'对应于48,'2'对应于50,所以'2'-'0'
得到你50-48 = 2
链接到 ASCII 表:http ://www.robelle.com/smugbook/ascii.html
当您使用逗号时,' '
您将数字视为 char,如果将其赋予 int,则 int 将采用该字符的 ASCII 码的值。
任何用单引号括起来的字符文字都对应一个代表该字符的 ASCII 代码的数字。事实上,此类文字的计算结果不是char
,而是int
,因此它们可以与其他数字文字完全互换。
在您的表达式中,'2'
可以与 互换50
,并且'0'
可以与 互换48
。
看看 ASCII 表。
'0'
表示为 0x30,'9'
表示为 0x32。
这导致
0x32 - 0x30 = 2
这都是关于相应字符的ASCII码的。
在 C 语言中,所有数字(0 到 9)都以 ASCII 值 48 到 57 顺序编码。所以'0'
实际上得到的值是 48,'2'
值是 50。所以当你写 时int i = '2' - '0';
,你实际上是从 50 中减去 48,得到 2。
'0'
to'9'
保证在所有字符集中都是 C 中的顺序值。这不限于 ASCII 和 C 不限于 ASCII 字符集。
所以这里的顺序意味着'2'
值是'0' + 2
。
关于int
并char
注意'0'
and '9'
values 是int
C 中的 type 而不是 type char
。字符文字的类型为int
。
这两个术语在内部由数字的 ASCII 代码表示,并且由于数字具有连续的 ASCII 代码,减去它们可以得到两个数字之间的差异。
您也可以对字符执行类似的技巧,例如通过从小写字符中减去 32 将小写转换为大写
'a' - 32 = 'A'
这只是因为 ASCII 按顺序为字符分配代码,即“2”的字符代码比“0”的字符代码大 2。
在另一种编码中它不起作用。
当您将 char 转换为 int 时,它实际上将每个字符映射到 ascii 表中的适当数字。
这意味着'2' - '0'
翻译为50 - 48
. 所以你也可以用同样的方法找出两个字母的数字距离,例如
'z' - 'a'
equals 122 - 97
equals25
您可以在 thsi 表中查找每个 ASCII 字符的数字表示: http ://www.asciitable.com/
实际上 achar
只是一个无符号字节:C 只是针对不同的操作以不同的方式对待它。例如printf(97)
产量97
作为输出,但printf((char)97)
会给你'a'
作为输出。