为啥将“0”添加到 int 数字允许转换为 char?
Posted
技术标签:
【中文标题】为啥将“0”添加到 int 数字允许转换为 char?【英文标题】:Why does adding a '0' to an int digit allow conversion to a char?为什么将“0”添加到 int 数字允许转换为 char? 【发布时间】:2014-08-16 19:31:56 【问题描述】:我到处都看到过这样的例子:
int i = 2;
char c = i + '0';
string s;
s += char(i + '0');
但是,我还没有看到为什么添加零可以进行转换的解释。
【问题讨论】:
c++ 中的char(i + '0');
是什么? (这是一个实际问题。)
@this 它在 topcoder 上编译:/
@this,它是整数 i
加上 '0'
提升为整数,结果被转换为具有函数样式转换的 char
,其作用与 C 相同-风格的演员。
这些答案没有提到的是完全允许字符集不兼容 ASCII。但是,如果发生这种情况,这仍然适用于i∈[0, 9]
,因为数字字符的字符代码保证是连续的。如果您想要一个不兼容 ASCII 的字符集示例,请查看 EBCDIC。数字'0'
-'9'
的字符代码分别为240-249。
【参考方案1】:
(char)(i+c)
其中c
是char
为您提供一个新的char
,其ascii 值等于(ascii 值c
)+i
。由于数字 0-9 的 ascii 值是连续的,i+'0'
会为您提供与i
对应的字符,只要i
在适当的范围内。
编辑:(i+c)
是一个 int,正如 Jarod42 指出的那样。添加了演员表以保持正确性。
【讨论】:
C++ 实现不需要使用 ASCII。将0
添加到 0 到 9 的值是可行的,因为 C 标准要求 '0'
到 '9'
的字符代码在 [lex.charset] 中是连续的。【参考方案2】:
如果您查看 ASCII 表 asciitable,您会看到数字从 48(即“0”)开始到 57(即“9”)。所以为了得到一个数字的字符代码,你可以将该数字添加到字符代码'0'中。
【讨论】:
C++ 实现不需要使用 ASCII。将0
添加到 0 到 9 的值是可行的,因为 C 标准要求 '0'
到 '9'
的字符代码在 [lex.charset] 中是连续的。【参考方案3】:
它基于 ASCII 值。添加 ASCII 值 0 即 48 意味着 48 + 5 将是 53 或 ASCII 53 即 5。
谷歌 ASCII 并找到一个好的图表并研究它。一旦您查看每个 char(字符)的值,这应该是有意义的。
【讨论】:
C++ 实现不需要使用 ASCII。将0
添加到 0 到 9 的值是可行的,因为 C 标准要求 '0'
到 '9'
的字符代码在 [lex.charset] 中是连续的。【参考方案4】:
使用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】:char 会根据 ASCII 值将整数转换为对应的值,所以如果你给一个 char 赋值 48 它将存储 0,因为 48 是 0 的 ASCII 值。相应地你添加 0 的 ASCII 值任何你需要转换为字符的整数
【讨论】:
这如何为已经存在的答案添加任何内容?无论如何,这并不完全正确。如果将值 48 分配给 char,它将存储 48(即'0'
在 char 变量中)。它不会存储 0,因为 0 != 48。
C++ 实现不需要使用 ASCII。将 0
添加到 0 到 9 的值是可行的,因为 C 标准要求 '0'
到 '9'
的字符代码在 [lex.charset] 中是连续的。【参考方案6】:
C++ 标准在其 [lex.charset] 部分中规定“上述十进制数字列表中 0 之后的每个字符的值应比前一个字符的值大一个”(引自草案 N4659)。
因此'1'
的值为'0'+1
,'2'
的值为'0'+2
,以此类推。如果n
的值介于0 到9 之间,则'0'+n
是从'0'
到'9'
的对应字符的值。
(与之前的答案不同,此答案不假定 ASCII 并显示该属性是如何从 C++ 标准派生的。)
【讨论】:
以上是关于为啥将“0”添加到 int 数字允许转换为 char?的主要内容,如果未能解决你的问题,请参考以下文章
为啥允许从 int 到 byte 但不允许从 long 到 int 的隐式缩小转换?
为啥建议从矩阵中获取最大值的函数->无法将'int(*)[C]'转换为'int(*)[0]