首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么10亿* 100 == 12亿?

为什么10亿* 100 == 12亿?
EN

Stack Overflow用户
提问于 2012-10-03 00:42:54
回答 2查看 1.1K关注 0票数 3

我有一个代码,它将单元格的默认值设置为上面单元格的值乘以100:

代码语言:javascript
复制
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亿),而不是1,000亿。

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

顺便说一句,这些数字比应用程序需要的更大,但我在测试“极端”情况下发现了这一点。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-03 00:46:51

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

算术:

代码语言:javascript
复制
(1 billion * 100) % (4,294,967,296) = 1215752192

C#代码中的概念证明:

代码语言:javascript
复制
var range = (Int64)Int32.MaxValue + 1 - Int32.MinValue;
Int64 val = 100000000000 % range;
Console.WriteLine(range);
Console.WriteLine(val);
票数 16
EN

Stack Overflow用户

发布于 2012-10-03 00:47:48

页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12694603

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档