问题标签 [integer-overflow]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
language-agnostic - 为什么默认情况下语言不会在整数溢出时引发错误?
在几种现代编程语言(包括 C++、Java 和 C#)中,该语言允许在运行时发生整数溢出,而不会引发任何类型的错误条件。
例如,考虑这个(人为的)C# 方法,它没有考虑上溢/下溢的可能性。(为简洁起见,该方法也不处理指定列表为空引用的情况。)
如果这个方法被调用如下:
方法中会发生溢出sumList()
(因为int
C#中的类型是32位有符号整数,列表中的值之和超过了最大32位有符号整数的值)。sum 变量的值为 -294967296(不是 4000000000);这很可能不是 sumList 方法的(假设的)开发人员想要的。
显然,开发人员可以使用多种技术来避免整数溢出的可能性,例如使用 Java 之类的类型BigInteger
,或者 C# 中的checked
关键字和/checked
编译器开关。
但是,我感兴趣的问题是为什么这些语言被设计为默认情况下首先允许整数溢出发生,而不是例如在运行时执行操作时引发异常,这会导致溢出。如果开发人员在编写执行可能导致溢出的算术运算的代码时忽略了溢出的可能性,这种行为似乎有助于避免错误。(这些语言可能包含类似“unchecked”关键字之类的东西,它可以指定一个允许发生整数溢出而不引发异常的块,在开发人员明确意图该行为的情况下;C# 实际上确实有 this . )
答案是否简单地归结为性能 - 语言设计者不希望他们各自的语言默认具有“慢”算术整数运算,运行时需要做额外的工作来检查每个适用的算术是否发生溢出操作——在发生意外溢出的情况下,这种性能考虑是否超过了避免“静默”故障的价值?
除了性能方面的考虑之外,这种语言设计决策还有其他原因吗?
c# - 我可以使用无符号右移防止 C# 中的整数溢出吗?
我希望 alwaysPositive 被分配一个正数,其中 lareValue1 和 largeValue2 的所有可能值(这些至少为 1)。
以下语句导致缓冲区溢出:
我知道我可以通过减去和添加来防止它:
但在其他编程语言中,我可以使用无符号位移位来解决问题:
我怎样才能在 C# 中做到这一点?
下面的答案都解决了这个问题。可能有很多方法可以做到这一点,但它们(包括我的解决方案)都有一个共同点:它们看起来都被混淆了。
c++ - 如何检测无符号整数乘法溢出?
我正在用 C++ 编写一个程序来查找a b = c的所有解决方案,其中a、b和c一起使用所有数字 0-9 一次。该程序循环遍历a和b的值,并且每次在a、b和a b上运行一个数字计数例程,以检查是否满足数字条件。
但是,当a b超出整数限制时,可能会生成虚假解。我最终使用以下代码检查了这一点:
有没有更好的方法来测试溢出?我知道有些芯片有一个在发生溢出时设置的内部标志,但我从未见过通过 C 或 C++ 访问它。
请注意,签名 int
溢出是 C 和 C++ 中未定义的行为,因此您必须检测它而不实际导致它。对于加法前的有符号整数溢出,请参阅在 C/C++ 中检测有符号溢出。
c - size_t 加法溢出
我喜欢为 VS.NET 和 GCC 提供免费的代码警告,并且我喜欢准备好我的 64 位代码。
今天我写了一个小模块,它处理内存缓冲区并通过文件样式接口提供对数据的访问(例如,您可以读取字节、写入字节、四处寻找等)。
作为当前读取位置和大小的数据类型,我使用了 size_t,因为这似乎是最自然的选择。我绕过警告,它也应该在 64 位下工作。
以防万一:我的结构如下所示:
的符号size_t
似乎在实践中没有定义。谷歌代码搜索证明了这一点。
现在我处于两难境地:我想检查是否有size_t
溢出,因为我必须处理用户提供的数据,而第三方库将使用我的代码。但是,对于溢出检查,我必须知道符号。它在实施中产生了巨大的差异。
那么 - 我到底应该如何以独立于平台和编译器的方式编写这样的代码?
我可以size_t
在运行或编译时检查签名吗?那将解决我的问题。或者,也许size_t
一开始就不是最好的主意。
有任何想法吗?
编辑:我正在寻找 C 语言的解决方案!
c# - 强制 PHP 整数溢出
我们有一些整数运算,由于历史原因,它在 PHP 上的工作方式与在一些静态类型语言中的工作方式相同。自从我们上次升级 PHP 以来,溢出整数的行为已经改变。基本上我们使用以下公式:
但是,即使有转换:
我仍然以完全错误的数字结束...
例如,对于 $x1 = -1580033017、$x2 = -2072974554、$x3 = -1170476976) 和 $x4 = -1007518822,我在 PHP 中得到 -30512150,在 C# 中得到 1617621783。
只是将 $x1 和 $x2 加在一起我无法得到正确的答案:
在 C# 中我得到
在 PHP 中:
这与以下内容相同:
我不介意写一个“IntegerOverflowAdd”函数之类的,但我不太清楚 (-1580033017 + -2072974554) 如何等于 641959725。(我知道它是 -2147483648 + (2 * 2^31) ,但是 -2147483648 + 2^31 是 -1505523923 大于 Int.Min 那么为什么要添加 2*2^31 而不是 2^31?)
任何帮助,将不胜感激...
c++ - 如何处理任意大的整数
我正在研究一种编程语言,今天我可以编译阶乘函数(递归),但是由于整数的最大大小,我可以获得的最大整数是阶乘(12)。有哪些技术可以处理任意最大大小的整数。该语言目前通过将代码翻译成 C++ 来工作。
java - Java乘法运算行为
我编写了一个将给定数字从天数转换为毫秒数的方法:
我很难弄清楚我做错了什么。现在我的问题是: 这个错误如此明显吗?
修正方法:
如果我在计算之前没有将整数转换为 long,我会得到一个完全错误的结果。
c# - 数组的大小是否受 int (2147483647) 的上限限制?
我正在做一些Project Euler练习,我遇到了一个场景,我想要int
大于 2,147,483,647( C# 中的上限)的数组。
当然这些是大数组,但例如,我不能这样做
那么,我可以有更大的数组吗?
编辑:这是为了阿特金筛子,你知道,所以我只想要一个非常大的:D
.net - 为什么会发生这种整数溢出?
我已经包装了一个 dll 方法,它有一个整数作为 web 服务中的 out 参数。在测试中,我发现当我期待 -1 时,我得到了 65,535。我意识到 dll 使用的是 16 位整数,并且在我的代码中引用外部 dll 时我指定了标准的 .NET 32 位整数。通过指定一个 16 位整数很快就解决了这个问题,一切都很好。
我的问题是为什么会这样?如果我试图将 32 位整数放入 16 位整数中,我可以理解发生溢出,但我不太确定为什么会反过来发生这种情况。显然,我对类型之间的这种类型转换的理解有点缺乏,所以任何指导都将不胜感激。
c - 分配给较大宽度整数时的 C 整数溢出行为
如果我在 C 中执行以下代码:
结果它正确打印了“-4000”。但是,我有点困惑:从另一个减去一个更大的无符号整数时不应该有算术溢出吗?这里有什么铸造规则?这个问题似乎有点无聊,所以任何参考都将不胜感激。