c# – 为什么10亿* 100 = 12亿?
发布时间:2020-12-15 19:57:02 所属栏目:百科 来源:网络整理
导读:我有代码将单元格的默认值设置为上面的单元格的值乘以100: const int DUCKBILL_MULTIPLIER = 100;. . .cellValue = dataGridViewPlatypi.Rows[args.RowIndex - 1].Cells[0].Value;if (Convert.ToInt32(cellValue) 0){ int nextDefaultVal = Convert.ToInt32
我有代码将单元格的默认值设置为上面的单元格的值乘以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; 但是,一旦上述值达到10亿(10亿),下一个值就是1215752192(1,215,752,192或大约12亿),而不是1000亿. 据我所知,max int值是2,147,483,647(约21亿);那么为什么下一个值为1,192而不是2,647? 顺便说一下,这些val比应用程序需要的要大,但我在测试“极端”情况时发现了这个. 解决方法
因为发生了多次溢出.每次达到2,647时,计数重新开始.现在,你必须记住它溢出到-2,648.所以我们必须考虑整个Int32范围,即4,294,967,296(它可以从(Int64)Int32.MaxValue 1 – Int32.MinValue或简单地计算为2 ^ 32.
数学: (1 billion * 100) % (4,296) = 1215752192 C#代码中的概念证明: var range = (Int64)Int32.MaxValue + 1 - Int32.MinValue; Int64 val = 100000000000 % range; Console.WriteLine(range); Console.WriteLine(val); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |