【发布时间】:2012-07-11 12:47:02
【问题描述】:
我知道要将任何给定的 char 转换为 int,此代码是可能的 [除了 atoi()]:
int i = '2' - '0';
但我一直不明白它是如何工作的,'0' 的含义是什么,我似乎在网上找不到任何解释。
提前致谢!!
【问题讨论】:
-
感谢所有回复,非常有用的东西:)
标签: c type-conversion
我知道要将任何给定的 char 转换为 int,此代码是可能的 [除了 atoi()]:
int i = '2' - '0';
但我一直不明白它是如何工作的,'0' 的含义是什么,我似乎在网上找不到任何解释。
提前致谢!!
【问题讨论】:
标签: c type-conversion
在 C 中,字符文字的类型为 int。 [Character Literals/IBM]
在您的示例中,'0' 的数值为 48,'2' 的数值为 50。当您执行 '2' - '0' 时,您将得到 50 - 48 = 2。这适用于 0 到 9 的 ASCII 数字。
请参阅ASCII table 以获得更好的图片。
编辑:感谢@ouah 的更正。
【讨论】:
'0' 是 int 不是因为整数提升,而是因为字符文字的类型是 int。
C 中的所有字符都用一个整数值表示,即字符的 ASCII 码。
例如,'0' 对应 48,'2' 对应 50,所以 '2'-'0' 得到你 50-48 = 2
链接到 ASCII 表:http://www.robelle.com/smugbook/ascii.html
【讨论】:
当您使用逗号 ' ' 时,您将数字视为一个字符,如果将其赋予一个 int,则 int 将采用该字符的 ASCII 码的值。
【讨论】:
用单引号括起来的任何字符文字都对应一个表示该字符的 ASCII 代码的数字。事实上,这些文字的计算结果不是char,而是int,因此它们可以与其他数字文字完全互换。
在您的表达式中,'2' 可与50 互换,'0' 可与48 互换。
【讨论】:
查看 ASCII 表。
'0' 表示为 0x30,'9' 表示为 0x32。
这会导致
0x32 - 0x30 = 2
【讨论】:
都是关于对应字符的ASCII codes。
在 C 中,所有数字(0 到 9)都以 ASCII 值 48 到 57 顺序编码。所以'0' 实际上得到的值是 48,'2' 的值是 50。所以当你写 int i = '2' - '0'; 时,你实际上是从 50 中减去 48,得到 2。
【讨论】:
'0' 到 '9' 保证在所有字符集中都是 C 中的顺序值。这不限于ASCII,C也不限于ASCII字符集。
这里的顺序意味着'2'的值是'0' + 2。
关于int 和char 请注意'0' 和'9' 值在C 中属于int 类型,而不是char 类型。字符文字的类型为 int。
【讨论】:
这两个术语在内部由数字的 ASCII 代码表示,并且由于数字具有连续的 ASCII 代码,减去它们可以得到两个数字之间的差异。
您也可以对字符进行类似的操作,例如通过从小写字符中减去 32 将小写转换为大写
'a' - 32 = 'A'
【讨论】:
这仅是因为 ASCII 按顺序为字符分配代码,即“2”的字符代码比“0”的字符代码大 2。
在另一种编码中它不起作用。
【讨论】:
当您将 char 转换为 int 时,它实际上将每个字符映射到 ascii 表中的适当数字。
这意味着'2' - '0' 被翻译成50 - 48。
所以你也可以用同样的方法找出两个字母的数字距离,例如
'z' - 'a' 等于 122 - 97 等于 25
您可以在 thsi 表中查找每个 ASCII 字符的数字表示: http://www.asciitable.com/
实际上char 只是一个无符号字节:C 只是针对不同的操作区别对待它。例如printf(97) 产生97 作为输出,但printf((char)97) 会给你'a' 作为输出。
【讨论】: