为什么我需要将int减去char才能得到正确的结果? C#

时间:2018-10-22 01:48:55

标签: c#

函数中有一行计算两位数的和。

我用以下语法求和:

.map((selectedSectionPks: MasterSection.SectionInfo) =>
    `${selectedSectionPks.Id}${selectedSectionPks.size}`);

将索引0上的数字乘以2。

sum += get2DigitSum((acctNumber[0] - '0')  * 2);

让我们说索引0上有9。如果我有public static int get2DigitSum(int num) { return (num / 10) + (num % 10); ,它将acctNumber[0] - '0'传递给另一个函数。但是,如果我在{之后没有9 {1}}通过- '0'。我不明白为什么不使用acctNumber[0]也会得到错误的结果。

3 个答案:

答案 0 :(得分:2)

文本“ 0”和数字0完全不等于计算机。

字符“ 0”实际上具有ASCII数字48(或十六进制为0x30),因此要将字符“ 0”转换为数字0,您需要减去48-在C语言和基于该语言的大多数语言中,可以写为减去字符“ 0”,该字符的数值为48。

妙处在于,字符“ 1”的ASCII码为49,所以减去数字48(或字符“ 0”)得出49-48 = 1,依此类推。

因此重要的部分是:计算机不仅对数据(机器某些部分的位模式)敏感,而且对数据的解释敏感-在您的情况下,将其解释为文本并将ist解释为数字不一样,但相差48,您需要通过减法消除它。

答案 1 :(得分:2)

因为您要向acctNumber[0]提供get2DigitSum

get2DigitSum接受一个整数,但是acctNumber[0]不是整数,它包含一个char,它代表一个带有整数值的字符。

因此,您需要减去0以获取整数。 “ 0”至“ 9”的ASCII值为48至57。

当您减去两个char值时,实际上会减去ASCII值。这就是为什么,您需要减去“ 0”

答案 2 :(得分:1)

内部所有字符均以数字表示。仅在显示期间,然后转换为精美象形图的数字。

现在,数字0-9是ASCII代码48-57。基本上,它们偏移+48。超过57岁时,您会发现英文字母的大小先后变小。在此之前,各种运算符甚至一堆无法打印的字符。

通常,您根本不会做这种数学运算。您可以将整个字符串输入Parse()或TryParse()函数中,然后使用已解析的数字。在某些情况下,您不会这样做,而坚决反对“带有字符的数学”:

  • 您不了解解析和整数
  • 您要在计算中支持任意大小的数字。这是一种常见的初学者方法(正确的方法是BigInteger)。
  • 您可能正在做一些事情,例如用完全解释的数字对字母/数字混合字符串进行排序(因此01排在10之前)。 Windows用相同的方式对其中带有数字的文件进行排序。
  • 您没有预先编写的解析功能。就像我2000年开始学习C ++时所做的一样。