为什么10亿*100 = 12亿?

B. *_*non 3 c# math

我有代码将单元格的默认值设置为上面的单元格的值乘以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;
Run Code Online (Sandbox Code Playgroud)

但是,一旦上述值达到10亿(10亿),下一个值就是1215752192(1,215,752,192或大约12亿),而不是1000亿.

据我所知,max int值是2,147,483,647(约21亿); 那么为什么下一个值为1,215,752,192而不是2,147,483,647?

顺便说一下,这些val比应用程序需要的要大,但我在测试"极端"情况时发现了这个.

Adr*_*iro 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
Run Code Online (Sandbox Code Playgroud)

C#代码中的概念证明:

var range = (Int64)Int32.MaxValue + 1 - Int32.MinValue;
Int64 val = 100000000000 % range;
Console.WriteLine(range);
Console.WriteLine(val);
Run Code Online (Sandbox Code Playgroud)


小智 5

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

这是由于整数溢出.

  • 当数字溢出时,它将溢出到"-2,147,483,648",而不是"0".你需要采用`4294967296`(2 ^ 32)的mod,在这种情况下仍然给出相同的答案. (2认同)