问题标签 [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.

0 投票
5 回答
4365 浏览

c# - -1 * int.MinValue == int.MinValue?? 这是一个错误吗?

在 C# 中,我看到了

这是一个错误吗?当我尝试实现搜索树时,它真的把我搞砸了。我最终使用了(int.MinValue + 1),以便我可以正确地否定它。

0 投票
2 回答
129 浏览

java - 如何在 J2ME 中查找和处理二进制/数字溢出

我正在构建一个使用 MathFP 库的单位转换器程序。通常,单位转换发生在以下公式中:

U1 (unit1) * K (常数) = U2 (unit2)

我希望能够检测到 int 何时溢出/下溢?我怎样才能检测到这种情况何时发生并优雅地处理问题。理想情况下,我会寻找一个通用的解决方案,因为我想用 long 类型的原语处理溢出:

我唯一的想法是:

我是否应该为这些转换使用不同的原始数据类型,例如双精度?

在此先感谢您的帮助

0 投票
2 回答
3139 浏览

c - GCC 内联汇编乘法

我正在尝试在 Linux (x86) 上学习 GCC 内联汇编,我的第一个实验是尝试为乘法实现整数溢出检测。这似乎很容易,但它有我不明白的副作用。

所以,这里我想将两个无符号的 8 位整数相乘,看看结果是否溢出。基本上我只是将第一个操作数加载到 AL 寄存器中,将另一个操作数加载到 BL 寄存器中,然后使用该mul指令。结果作为 16 位值存储在 AX 寄存器中。所以我然后将 AX 寄存器中的值复制到我的 C 变量b中,除非它溢出。如果溢出,我设置c为 1。

这似乎工作正常。如果我printf得到 'b' 的值,我得到 250,这是正确的。另外,如果我将'b'的起始值更改为26,那么在乘法c设置为1之后,表明溢出当然是因为(10 * 26>〜uint8_t(0))。我看到的问题是 C 变量a在乘法之后设置为 0(或在溢出时设置为 1。)我不明白为什么a我在这里所做的任何事情都会改变。它甚至不在输出变量列表中,那么为什么我的汇编程序会影响 的值a

另外,我不确定被破坏的寄存器列表。这个列表应该通知 GCC 任何在汇编例程中使用的寄存器,这样 GCC 就不会试图错误地使用它们。我想我需要通知 GCC 我使用了 AL 和 BL 寄存器,但是 AX 寄存器呢?它被隐式用于存储两个 8 位整数的乘积,所以我需要将它包含在被破坏的寄存器列表中吗?

0 投票
4 回答
1764 浏览

java - java算术

为什么这段代码返回错误的值?

0 投票
1 回答
5442 浏览

mips - 带 32 位寄存器的双精度整数减法 (MIPS)

我正在学习计算机算术。我使用的书(帕特森和轩尼诗)列出了以下问题。

编写 mips 代码对 64 位数据进行双精度整数减法。假设第一个操作数在寄存器 $t4(hi) 和 $t5(lo) 中,第二个在 $t6(hi) 和 $t7(lo) 中。

我对答案的解决方案是

但是作者针对此问题给出的解决方案如下

对于有符号双精度整数,

对于无符号双精度整数,

我对sub/addand操作差异的理解subu/addu是溢出异常是在sub/add而不是在subu/addu. sub/add和 和subu/addu减/加操作数的位以及对有符号或无符号操作数的解释对结果没有影响,这与 in和slt指令sltu不同。

问题 1
我从作者给出的解决方案中推断出正在处理溢出检测,而我在我的解决方案中没有想到相同的解决方案。我对吗?还有什么我想念的吗?

问题 2假设我的上述推论是正确的,为什么在使用and
减去无符号双精度的情况下,作者提供的解决方案会关闭溢出检测?addusubu

0 投票
13 回答
34555 浏览

c++ - 在 C/C++ 中检测有符号溢出

乍一看,这个问题似乎与如何检测整数溢出?,但实际上有很大不同。

我发现虽然检测无符号整数溢出非常简单,但检测 C/C++ 中的有符号溢出实际上比大多数人想象的要困难。

最明显但最幼稚的方法是:

问题在于,根据 C 标准,有符号整数溢出是未定义的行为。 换句话说,根据标准,一旦您甚至导致有符号溢出,您的程序就如同取消引用空指针一样无效。所以你不能导致未定义的行为,然后在事后尝试检测溢出,如上面的后置条件检查示例。

尽管上述检查可能适用于许多编译器,但您不能指望它。事实上,因为 C 标准说有符号整数溢出是未定义的,所以一些编译器(如 GCC)会在设置优化标志时优化掉上述检查,因为编译器假定有符号溢出是不可能的。这完全破坏了检查溢出的尝试。

因此,检查溢出的另一种可能方法是:

这似乎更有希望,因为我们实际上不会将两个整数相加,直到我们事先确保执行这样的相加不会导致溢出。因此,我们不会导致任何未定义的行为。

但是,不幸的是,此解决方案的效率比初始解决方案低很多,因为您必须执行减法运算才能测试您的加法运算是否有效。即使你不关心这个(小)性能损失,我仍然不完全相信这个解决方案是足够的。该表达式lhs <= INT_MIN - rhs看起来与编译器可能优化掉的那种表达式完全一样,认为有符号溢出是不可能的。

那么这里有更好的解决方案吗?保证 1) 不会导致未定义的行为,以及 2) 不会为编译器提供优化溢出检查的机会?我在想可能有一些方法可以通过将两个操作数都转换为无符号数,并通过滚动你自己的二进制补码算术来执行检查,但我不确定如何做到这一点。

0 投票
1 回答
1182 浏览

c++ - 减法整数溢出的种类

我正在尝试重新学习 C++,使用 Sams Teach Yourself C++ in 21 Days(第 6 版)。我正在尝试非常彻底地完成它,确保我理解每一章(尽管我已经熟悉 C 语法语言)。

在第 5 章(清单 5.2)的开头附近,有一点是关于无符号整数溢出的。根据他们的例子,我写了这个:

这给出了以下输出,这对我来说并不奇怪:

如果我更改程序以便声明的行bignum改为读取,unsigned int bignum = 3000000000;则输出改为

其中第一个显然很好。这个数字1294967346是由一个事实来解释12949673462^32 - 3000000000。我不明白为什么第二行没有读取1294967396,因为 50 贡献了smallnum.

第三和第四行我无法解释。这些结果是如何产生的?

编辑:对于第三行 - 它是否仅通过找到2^32适合有符号 int 允许的值范围的解模来给出此结果?

0 投票
2 回答
1127 浏览

c# - 1000000000 * 3 = -1294967296?

我很困惑!

今天是11月3日

shazbot 出现在 -1294967296

啊???

0 投票
1 回答
1736 浏览

c++-cli - 将 Object 转换为 C++ 内置类型

我有以下最少的代码:

它在功能上给出了OverflowException例外。get_prop最后,我需要使用get_prop纯 C++ 代码中的结果。编写函数的正确方法是什么,get_prop以便在这两种情况下都能正常工作。我可以使用 C++ 中的某种模板还是更简单的解决方案?

0 投票
7 回答
4714 浏览

c - 即使 a 乘以 b 不适合这种类型,如何仅使用 32 位整数类型计算 (a 乘以 b) 除以 c

考虑以下作为参考实现:

我对不需要 64 位整数类型的实现(在 C 或伪代码中)感兴趣。

我开始草拟一个概述如下的实现:

但困难在于为 d1 和 d2 选择能够避免溢出的值 ((a / d1) * (b / d2) <= UINT32_MAX) 并最大限度地减少整个计算的错误。

有什么想法吗?