请大神帮忙解释以次两句代码的原理

请大神帮忙解释以下两句代码的原理
#include <iostream>
using namespace std;
void converlong(string n, long&);

int main(void){

    string a="abcdef85";                //待转换的字符串
long lvalue=0;                     //保存转换后的值
converlong(a, lvalue);               //执行转换
cout<<lvalue<<":"<<lvalue+1<<endl;   //输出转换结果
}

// n为待转换的字符串,lvalue 为转换结果
void converlong(string n, long& lvalue){

     string::size_type index=0;
 for (; index<n.size(); index++){
 
      char m='0';
  char p='9';
   
   //过滤所有小于字符 ‘0’ 和大于字符‘9’的字符
   if (n[index]>m && n[index]<p){
   
       //将字符转换为整数
   long temp=n[index]-48;           |   请大神帮忙解释以下两句代码的原理,本人不知道这两句代码是如何实现的。
   lvalue=lvalue * 10 + temp;      |
   }
 }
}
------解决思路----------------------
long temp = n[index] - 48;
实际上就是
long temp = n[index] - '0';
相当于把字符转换为数字

lvalue = lvalue * 10  + temp;
就是把数字加上自己的权位(比如个十百千位),最终把字符串转换为整数了。
------解决思路----------------------
修改如下:

#include <iostream>
#include <string>
using namespace std;
void converlong(string n, long&);
int main(void){
    string a = "abcdef85";                  //待转换的字符串
long lvalue = 0;                        //保存转换后的值
converlong(a, lvalue);                  //执行转换
//为啥加一?
//cout << lvalue << ":" << lvalue + 1 << endl;    //输出转换结果
cout << "lvalue" << ":" << lvalue << endl;          //输出转换结果
return 0;
}
//n为待转换的字符串,lvalue为转换结果
void converlong(string n, long& lvalue){
string::size_type index=0;
for (; index < n.size(); index++){
char m = '0';
char p = '9';
//过滤所有小于字符 ‘0’ 和大于字符‘9’的字符
//if (n[index]>m && n[index]<p){
if (n[index] >= m && n[index] <= p){
//将字符转换为整数
long temp = n[index] - 48;
lvalue = lvalue * 10 + temp; 
}
}
}

------解决思路----------------------
char字符实际上存储的是整数,
char c1 = 'A'; 相当于char c2 = 65;
因此int  i = c1 - c2;的结果是
i = 65-65 = 0;
同样的,long lvalue = ‘8’ - ‘0’ = 8;
这里’0‘ 对应的是整数48;