我无法理解字符串如何转换为整数的概念

Ran*_*esh 2 c++ string integer

我引用了一个时间转换程序,但无法理解代码的某些部分.这是完整的计划.

#include<iostream>
#include<cstdio>

using namespace std;

int main() {
    string s;
    cin >> s;

    int n = s.length();
    int hh, mm, ss;
    hh = (s[0] - '0') * 10 + (s[1] - '0');
    mm = (s[3] - '0') * 10 + (s[4] - '0');
    ss = (s[6] - '0') * 10 + (s[7] - '0');

    if (hh < 12 && s[8] == 'P') hh += 12;
    if (hh == 12 && s[8] == 'A') hh = 0;

    printf("%02d:%02d:%02d\n", hh, mm, ss);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我无法理解的代码部分是

    hh = (s[0] - '0') * 10 + (s[1] - '0');
    mm = (s[3] - '0') * 10 + (s[4] - '0');
    ss = (s[6] - '0') * 10 + (s[7] - '0');
Run Code Online (Sandbox Code Playgroud)

提前致谢.

Som*_*ude 6

如果您看到例如此ASCII表(ASCII是最常用的字符编码方案),您可以看到该字符 '2'具有十进制值50,并且该字符'0'具有十进制值48.

考虑到一个字符只是一个小整数,我们可以对它们使用常规算术.这意味着如果你这样做'2' - '0',那就像50 - 48产生小数值那样2.

因此,要获取字符数字的十进制值,只需减去'0'.

乘法10是因为我们正在处理十进制系统,其中一个数字21是相同的2 * 10 + 1.


应该注意的是,C++规范明确规定所有数字都必须在一个连续的范围内编码,因此无论使用哪种编码都无关紧要.

您可能会看到这个"技巧"也用于获取字母的十进制值,但请注意C++规范没有说明任何内容.事实上,编码中的字母范围不是连续的,而且不起作用.它仅指定用于数字.