为什么在int数字后面加上'0'就可以转换成char类型?

16

我在各处都看到了这方面的例子:

int i = 2;
char c = i + '0';
string s;
s += char(i + '0');

然而,我还没有看到为什么添加零可以进行转换的解释。


char(i + '0'); 在C++中是什么意思?(这是一个实际的问题。 - this
@这个在Topcoder上编译通过:/ - sgarza62
2
@this,这是将整数i与'0'相加并提升为整数,将结果强制转换为使用函数风格的强制转换符char,其所做的与C风格强制转换相同。 - chris
2
这些答案没有提到的是,字符集完全可以不兼容ASCII。然而,如果是这种情况,对于 i∈[0, 9] 仍然有效,因为数字字符的字符代码保证是连续的。如果您想要一个不兼容ASCII的字符集示例,请查看EBCDIC。数字 '0'-'9' 的字符代码分别为240-249。 - chris
6个回答

15
如果你查看 ASCII 表 asciitable,你会发现数字从 48 开始(即 '0'),一直到 57(对应 '9')。因此,为了获取数字的字符编码,你可以将该数字加上字符 '0' 的字符编码。

3
C++的实现不一定需要使用ASCII码。将数值0到9之间的值加上0是可行的,因为C++标准要求'0''9'的字符代码是连续的,在[lex.charset]章节中有说明。 - Eric Postpischil

11
当使用ASCII编码时,字符'0'的整数值为48
'0' + 1 = 49 = '1'
'0' + 2 = 50 = '2'

...

'0' + 9 = 57 = '9'

因此,如果您想将数字转换为相应的字符,只需将'0'添加到数字上。

即使平台使用非ASCII编码,语言仍保证字符'0' - '9'必须被编码为:

'1' - '0' = 1
'2' - '0' = 2
'3' - '0' = 3
'4' - '0' = 4
'5' - '0' = 5
'6' - '0' = 6
'7' - '0' = 7
'8' - '0' = 8
'9' - '0' = 9

当使用ASCII编码时,它会变成:
'1' - '0' = 49 - 48 = 1
'2' - '0' = 50 - 48 = 2
'3' - '0' = 51 - 48 = 3
'4' - '0' = 52 - 48 = 4
'5' - '0' = 53 - 48 = 5
'6' - '0' = 54 - 48 = 6
'7' - '0' = 55 - 48 = 7
'8' - '0' = 56 - 48 = 8
'9' - '0' = 57 - 48 = 9

因此,无论平台使用什么字符编码,这些行都将被视为具有相同的长度。
int i = 2;
char c = i + '0';

这将始终导致c的值等于字符'2'


5
C++标准在[lex.charset]章节中指出:“上述十进制数字列表中每个字符的值都应比前一个大1”(引自N4659草案)。
因此,'1'的值为'0'+1'2'的值比它大1,即'0'+2',以此类推。如果n的值在0到9之间,则'0'+n是从'0''9'对应字符的值。
(与早期答案不同,此答案不假定ASCII并展示了该属性如何源于C++标准。)

2

这是基于ASCII值的。将ASCII值为0的数字加上48,意味着48 + 5将变成53或者ASCII 53,即数字5。

你可以谷歌ASCII并找到一个好的图表来学习。一旦你查看每个字符(char)的数值,它应该就很容易明白了。


1
C++实现不需要使用ASCII。将0添加到0到9之间的值中是有效的,因为C标准要求“0”到“9”的字符代码是连续的,在[lex.charset]中规定。 - Eric Postpischil

0

(char)(i+c) 其中 c 是一个 char,可以给你一个新的 char,其 ASCII 值等于 c 的 ASCII 值加上 i。由于数字 0-9 的 ASCII 值是连续的,只要 i 在适当的范围内,i+'0' 就可以给你对应于 i 的字符。

编辑:如 Jarod42 指出的那样,(i+c) 是一个 int。为了保持正确性,添加了一个强制转换。


C++的实现不需要使用ASCII。将0添加到0到9之间的值中有效是因为C标准要求“0”到“9”的字符代码是连续的,在[lex.charset]中。 - Eric Postpischil

-4

一个字符将根据ASCII值将整数转换为相应的值,因此,如果您将48分配给字符,则它将存储0,因为48是0的ASCII值。同样,您可以将0的ASCII值添加到任何需要转换为字符的整数。


2
这句话对已有的答案有何补充?无论如何,它并不完全正确。如果你将值48赋给一个char变量,它将存储48(在char变量中是'0')。它不会存储0,因为0 != 48。 - John Coleman
2
C++的实现不需要使用ASCII。将0添加到0到9之间的值中有效是因为C标准要求“0”到“9”的字符代码是连续的,在[lex.charset]中。 - Eric Postpischil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接