3

我有代码将单元格的默认值设置为上述单元格的值乘以 100:

const int DUCKBILL_MULTIPLIER = 100;
. . .
cellValue = dataGridViewPlatypi.Rows[args.RowIndex - 1].Cells[0].Value;
if (Convert.ToInt32(cellValue) > 0)
{
    int nextDefaultVal = Convert.ToInt32(cellValue) * DUCKBILL_MULTIPLIER;
    cellValue = nextDefaultVal;
}
prevVal = cellValue == null ? string.Empty : cellValue.ToString();
. . .
dataGridViewPlatypi.Rows[args.RowIndex].Cells[args.ColumnIndex].Value = prevVal;

但是一旦上面的值变成 1000000000(10 亿),下一个值是 1215752192(1,215,752,192 或大约 12 亿)而不是 1000 亿。

我了解最大 int 值为 2,147,483,647(约 21 亿);那么为什么下一个值是 1,215,752,192 而不是 2,147,483,647?

顺便说一句,这些 val 比应用程序需要的更大,但我在测试“极端”案例时发现了这一点。

4

2 回答 2

16

因为发生了多次溢出。每次达到 2,147,483,647 时,计数重新开始。现在,您必须记住它溢出到 -2,147,483,648。(Int64)Int32.MaxValue + 1 - Int32.MinValue所以我们必须考虑整个 Int32 范围,即4,294,967,296(可以从2^32.

数学:

(1 billion * 100) % (4,294,967,296) = 1215752192

C# 代码中的概念证明:

var range = (Int64)Int32.MaxValue + 1 - Int32.MinValue;
Int64 val = 100000000000 % range;
Console.WriteLine(range);
Console.WriteLine(val);
于 2012-10-02T16:46:51.287 回答
5

(1,000,000,000 * 100) mod ((2,147,483,647 + 1) * 2) = 1,215,752,192

这是由于整数溢出

于 2012-10-02T16:47:48.383 回答