为什么1 + 0 + 0 + 0 + 3 == 244?

时间:2013-09-03 23:55:05

标签: c#

将值“01200000131”传递给此方法:

private static int sumOddVals(string barcode)
{
    int cumulativeVal = 0;
    for (int i = 0; i < barcode.Length; i++)
    {
        if (i % 2 != 0)
        {
            MessageBox.Show(string.Format("i is {0}; barcode{0} is {1}", i, barcode[i]));
            cumulativeVal += Convert.ToInt16(barcode[i]);
        }
    }
    MessageBox.Show(string.Format("Odd total is {0}", cumulativeVal));
    return cumulativeVal;
}

...返回“244”

我期待它返回“4”。

第一个消息框显示我期望看到的内容,即“1”,然后是“0”三次,然后是“3”,我希望加起来为“4”,而不是“244” 。

2 个答案:

答案 0 :(得分:10)

您正在将数字char值转换为int

 cumulativeVal += Convert.ToInt16(barcode[i]); // Indexer on a string is a char

你想要的是...将该数字的字符串表示转换为数字..而不是char值..所以添加ToString()

 cumulativeVal += Convert.ToInt16(barcode[i].ToString());

编辑:

或者,正如评论中所指出的那样:

 cumulativeVal += Convert.ToInt16(barcode[i] - '0');

结果:4。

答案 1 :(得分:1)

这一行:

    Convert.ToInt16(barcode[i])

char值(barcode[i])转换为short。但是,无论如何,在调用int之前,字符值被隐式转换为ToInt16(),因此它有效地将字符代码转换为其整数等价物,即自身。因此'0'转换为48。

你想要的是这样的:

    (barcode[i] - '0')

适用于所有十进制数字('0''9')。

警告

如果barcode[i]不是十进制数字字符,您将得到奇怪的结果。 (无论如何,你的代码应该检查这个。)