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 億) になると、次の値は 1000 億ではなく 1215752192 (1,215,752,192 または約 12 億) になります。

最大の int 値が 2,147,483,647 (約 21 億) であることは理解しています。では、なぜ次の値は 2,147,483,647 ではなく 1,215,752,192 なのですか?

ところで、これらの値はアプリが必要とするよりも大きいですが、「極端な」ケースのテストでこれを見つけました。

4

2 に答える 2

16

複数のオーバーフローが発生しているためです。2,147,483,647に達するたびに、カウントが最初からやり直されます。ここで、-2,147,483,648にオーバーフローすることに注意する必要があります。したがって、Int32の範囲全体(4,294,967,296)を考慮する必要があります(これは、から、(Int64)Int32.MaxValue + 1 - Int32.MinValueまたは単純に計算できます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 に答える