为啥将“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) 其中cchar 为您提供一个新的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?的主要内容,如果未能解决你的问题,请参考以下文章

在sql语句中怎样把char类型转换成int类型?

为啥允许从 int 到 byte 但不允许从 long 到 int 的隐式缩小转换?

为啥建议从矩阵中获取最大值的函数->无法将'int(*)[C]'转换为'int(*)[0]

为啥将 C++ 字符串转换为 int?

C 中从 Float 到 Int 的类型转换导致数字大不相同,为啥?

在 std::string 中仅将数字转换为 int