将字符串转换为数字时,为什么减去'0'?

问题描述:

我是C新手,我一直在寻找一个定制函数在C中将字符串转换为整数,我碰到这个算法,除了一个部分是非常有意义的。 -'0'究竟是做什么的n = n * 10 + a[c] - '0';将字符串转换为数字时,为什么减去'0'?

int toString(char a[]) { 
     int c, sign, offset, n; 

     if (a[0] == '-') { // Handle negative integers 
     sign = -1; 
     } 

     if (sign == -1) { // Set starting position to convert 
     offset = 1; 
     } 
     else { 
     offset = 0; 
     } 

     n = 0; 

     for (c = offset; a[c] != '\0'; c++) { 
     n = n * 10 + a[c] - '0'; 
     } 

     if (sign == -1) { 
     n = -n; 
     } 

     return n; 
    } 

该算法没有从我找到它的位置解释,here

+1

见http://www.asciitable.com/ - 注意数字字符 – user2864740 2014-09-27 23:22:38

+0

否,*字符*''0的关系(和值) ''的值是48,'\ 0''是0是NUL。 – user2864740 2014-09-27 23:28:48

减去'0'作品的原因是,从小数位开始的'0'开始顺序排列字符代码点,没有间隙。换句话说,'5'的字符代码大于'0'的字符代码5; '6'的字符代码大于'0'的字符代码6,依此类推。因此,从另一个数字的代码中减去零'0'的代码将生成相应数字的值。

这种安排对于ASCII码,EBSDIC,UNICODE十进制数码等是正确的。对于ASCII码,数字代码是这样的:

'0' 48 
'1' 49 
'2' 50 
'3' 51 
'4' 52 
'5' 53 
'6' 54 
'7' 55 
'8' 56 
'9' 57 

假设x具有'0''9'之间,x - '0'产生09之间的值的范围内的值。因此,x - '0'基本上将十进制数字字符常量转换为其数字整数值(例如,'5'5)。

Ç说'0''9'是实现定义的值,但是C也保证'0''9'是连续的值。

+0

对不起,我还没有理解这个,在这种情况下是'x','n'? – 2014-09-27 23:23:43

+0

@Bridenstine这里'x'在你的程序中是'a [c]' – ouah 2014-09-27 23:25:01