【问题标题】:can someone please tell why " -'0' "is being done in the fifth line of following function [duplicate]有人可以告诉为什么“-'0'”在以下函数的第五行中完成[重复]
【发布时间】:2018-11-04 05:20:55
【问题描述】:
 m=1e9 + 7;
inline ll rem(char s[],ll m)
{
     ll sum=0 , i;
     for(i=0;S[i]!='\0';i++)
     {
          if(sum>=m)
            sum %= m;
          sum=(sum * 10 + S[i] - '0');
     }
     return sum%m;
}

这里的S[i] 是一个整数字符串。我的问题是 -'0'在这里是做什么的,也可以将一个字符(这里S[i])自动转换成整数形式就是上面的

sum=(sum * 10 + S[i] - '0');

方程。

【问题讨论】:

  • 将 ascii 数字转换为整数值
  • 从一个字符中减去'0' 将得到它的数值,假设该字符代表一个数字。
  • 有人请找一个重复的,这不可能是第一次有人问。
  • 我敢肯定,连第二个或第三个都没有。

标签: c


【解决方案1】:

首先,您必须记住,C 中的字符表示为与机器字符集中字符值相对应的微小整数,通常是 ASCII。

例如,'A'n ASCII 为 65,'0' 为 48。

因此,如果要将一串数字转换为整数,则需要执行类似的操作

int digit = c - 48;

'0' 转换为0,将'1' 转换为1,等等。

但是这个神奇的数字 48 很神秘,理论上它在使用非 ASCII 字符集的机器上也是错误的。所以更容易(因为你不必记住值 48)、自我记录(只要你的读者理解成语)和更便携的方式就是这样做

int digit = c - '0';

这行得通,因为正如我所说,'0' 在 ASCII 中是 48。但是,更重要的是,即使在非 ASCII 机器上,'0' 是字符 '0' 在该机器字符集中具有的任何值,因此无论您使用哪种机器,减去它始终是正确的值.

【讨论】:

  • 而 C 要求 '0' .. '9' 连续表示。
猜你喜欢
  • 2022-06-17
  • 2014-02-03
  • 2021-11-16
  • 2020-12-25
  • 1970-01-01
  • 2019-12-02
  • 1970-01-01
  • 2019-10-16
  • 1970-01-01
相关资源
最近更新 更多