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

时间:2014-09-27 23:20:25

标签: c

我是C的新手,我在C中寻找一个自定义函数,它将字符串转换为整数,我遇到了这个算法,除了一个部分之外,这个算法非常有意义。 -'0'在这一行n = n * 10 + a[c] - '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

2 个答案:

答案 0 :(得分:4)

减去'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

答案 1 :(得分:2)

假设x的值介于'0''9'之间,x - '0'会产生09之间的值。所以x - '0'基本上将十进制数字字符常量转换为其数字整数值(例如,'5'5)。

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