1

我知道要将任何给定的 char 转换为 int,此代码是可能的 [除了 atoi()]:

int i = '2' - '0';

但我从来不明白它是如何工作的,'0' 的意义是什么,我似乎没有在网上找到任何解释。

提前致谢!!

4

10 回答 10

8

在 C 中,字符文字的类型为int。[字符文字/IBM ]

在您的示例中, 的数值'0'为 48, 的数值'2'为 50。当您这样做时,'2' - '0'您会得到50 - 48 = 2. 这适用于从 0 到 9 的 ASCII 数字。

请参阅ASCII 表以获得更好的图像。

编辑:感谢@ouah 的更正。

于 2012-07-11T12:49:09.380 回答
3

C 中的所有字符都用一个整数值表示,即字符的 ASCII 码。例如'0'对应于48,'2'对应于50,所以'2'-'0'得到你50-48 = 2

链接到 ASCII 表:http ://www.robelle.com/smugbook/ascii.html

于 2012-07-11T12:50:14.150 回答
2

当您使用逗号时,' '您将数字视为 char,如果将其赋予 int,则 int 将采用该字符的 ASCII 码的值。

于 2012-07-11T12:49:38.993 回答
2

任何用单引号括起来的字符文字都对应一个代表该字符的 ASCII 代码的数字。事实上,此类文字的计算结果不是char,而是int,因此它们可以与其他数字文字完全互换。

在您的表达式中,'2'可以与 互换50,并且'0'可以与 互换48

于 2012-07-11T12:50:02.777 回答
2

看看 ASCII 表。

'0'表示为 0x30,'9'表示为 0x32。

这导致

0x32 - 0x30 = 2
于 2012-07-11T12:50:19.073 回答
2

这都是关于相应字符的ASCII码的。

在 C 语言中,所有数字(0 到 9)都以 ASCII 值 48 到 57 顺序编码。所以'0'实际上得到的值是 48,'2'值是 50。所以当你写 时int i = '2' - '0';,你实际上是从 50 中减去 48,得到 2。

于 2012-07-11T12:51:01.293 回答
2

'0'to'9'保证在所有字符集中都是 C 中的顺序值。这不限于 ASCII 和 C 不限于 ASCII 字符集。

所以这里的顺序意味着'2'值是'0' + 2

关于intchar注意'0'and '9'values 是intC 中的 type 而不是 type char。字符文字的类型为int

于 2012-07-11T12:51:09.037 回答
2

这两个术语在内部由数字的 ASCII 代码表示,并且由于数字具有连续的 ASCII 代码,减去它们可以得到两个数字之间的差异。

您也可以对字符执行类似的技巧,例如通过从小写字符中减去 32 将小写转换为大写

'a' - 32 = 'A'
于 2012-07-11T12:51:49.857 回答
2

这只是因为 ASCII 按顺序为字符分配代码,即“2”的字符代码比“0”的字符代码大 2。

在另一种编码中它不起作用。

于 2012-07-11T12:52:33.487 回答
2

当您将 char 转换为 int 时,它实际上将每个字符映射到 ascii 表中的适当数字。

这意味着'2' - '0'翻译为50 - 48. 所以你也可以用同样的方法找出两个字母的数字距离,例如 'z' - 'a'equals 122 - 97equals25

您可以在 thsi 表中查找每个 ASCII 字符的数字表示: http ://www.asciitable.com/

实际上 achar只是一个无符号字节:C 只是针对不同的操作以不同的方式对待它。例如printf(97)产量97作为输出,但printf((char)97)会给你'a'作为输出。

于 2012-07-11T12:54:00.007 回答