问题标签 [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.
c# - -1 * int.MinValue == int.MinValue?? 这是一个错误吗?
在 C# 中,我看到了
这是一个错误吗?当我尝试实现搜索树时,它真的把我搞砸了。我最终使用了(int.MinValue + 1)
,以便我可以正确地否定它。
java - 如何在 J2ME 中查找和处理二进制/数字溢出
我正在构建一个使用 MathFP 库的单位转换器程序。通常,单位转换发生在以下公式中:
U1 (unit1) * K (常数) = U2 (unit2)
我希望能够检测到 int 何时溢出/下溢?我怎样才能检测到这种情况何时发生并优雅地处理问题。理想情况下,我会寻找一个通用的解决方案,因为我想用 long 类型的原语处理溢出:
我唯一的想法是:
我是否应该为这些转换使用不同的原始数据类型,例如双精度?
在此先感谢您的帮助
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 位整数的乘积,所以我需要将它包含在被破坏的寄存器列表中吗?
java - java算术
为什么这段代码返回错误的值?
mips - 带 32 位寄存器的双精度整数减法 (MIPS)
我正在学习计算机算术。我使用的书(帕特森和轩尼诗)列出了以下问题。
编写 mips 代码对 64 位数据进行双精度整数减法。假设第一个操作数在寄存器 $t4(hi) 和 $t5(lo) 中,第二个在 $t6(hi) 和 $t7(lo) 中。
我对答案的解决方案是
但是作者针对此问题给出的解决方案如下
对于有符号双精度整数,
对于无符号双精度整数,
我对sub/add
and操作差异的理解subu/addu
是溢出异常是在sub/add
而不是在subu/addu
. sub/add
和 和subu/addu
减/加操作数的位以及对有符号或无符号操作数的解释对结果没有影响,这与 in和slt
指令sltu
不同。
问题 1
我从作者给出的解决方案中推断出正在处理溢出检测,而我在我的解决方案中没有想到相同的解决方案。我对吗?还有什么我想念的吗?
问题 2假设我的上述推论是正确的,为什么在使用and
减去无符号双精度的情况下,作者提供的解决方案会关闭溢出检测?addu
subu
c++ - 在 C/C++ 中检测有符号溢出
乍一看,这个问题似乎与如何检测整数溢出?,但实际上有很大不同。
我发现虽然检测无符号整数溢出非常简单,但检测 C/C++ 中的有符号溢出实际上比大多数人想象的要困难。
最明显但最幼稚的方法是:
问题在于,根据 C 标准,有符号整数溢出是未定义的行为。 换句话说,根据标准,一旦您甚至导致有符号溢出,您的程序就如同取消引用空指针一样无效。所以你不能导致未定义的行为,然后在事后尝试检测溢出,如上面的后置条件检查示例。
尽管上述检查可能适用于许多编译器,但您不能指望它。事实上,因为 C 标准说有符号整数溢出是未定义的,所以一些编译器(如 GCC)会在设置优化标志时优化掉上述检查,因为编译器假定有符号溢出是不可能的。这完全破坏了检查溢出的尝试。
因此,检查溢出的另一种可能方法是:
这似乎更有希望,因为我们实际上不会将两个整数相加,直到我们事先确保执行这样的相加不会导致溢出。因此,我们不会导致任何未定义的行为。
但是,不幸的是,此解决方案的效率比初始解决方案低很多,因为您必须执行减法运算才能测试您的加法运算是否有效。即使你不关心这个(小)性能损失,我仍然不完全相信这个解决方案是足够的。该表达式lhs <= INT_MIN - rhs
看起来与编译器可能优化掉的那种表达式完全一样,认为有符号溢出是不可能的。
那么这里有更好的解决方案吗?保证 1) 不会导致未定义的行为,以及 2) 不会为编译器提供优化溢出检查的机会?我在想可能有一些方法可以通过将两个操作数都转换为无符号数,并通过滚动你自己的二进制补码算术来执行检查,但我不确定如何做到这一点。
c++ - 减法整数溢出的种类
我正在尝试重新学习 C++,使用 Sams Teach Yourself C++ in 21 Days(第 6 版)。我正在尝试非常彻底地完成它,确保我理解每一章(尽管我已经熟悉 C 语法语言)。
在第 5 章(清单 5.2)的开头附近,有一点是关于无符号整数溢出的。根据他们的例子,我写了这个:
这给出了以下输出,这对我来说并不奇怪:
如果我更改程序以便声明的行bignum
改为读取,unsigned int bignum = 3000000000;
则输出改为
其中第一个显然很好。这个数字1294967346
是由一个事实来解释1294967346
的2^32 - 3000000000
。我不明白为什么第二行没有读取1294967396
,因为 50 贡献了smallnum
.
第三和第四行我无法解释。这些结果是如何产生的?
编辑:对于第三行 - 它是否仅通过找到2^32
适合有符号 int 允许的值范围的解模来给出此结果?
c# - 1000000000 * 3 = -1294967296?
我很困惑!
今天是11月3日
shazbot 出现在 -1294967296
啊???
c++-cli - 将 Object 转换为 C++ 内置类型
我有以下最少的代码:
它在功能上给出了OverflowException
例外。get_prop
最后,我需要使用get_prop
纯 C++ 代码中的结果。编写函数的正确方法是什么,get_prop
以便在这两种情况下都能正常工作。我可以使用 C++ 中的某种模板还是更简单的解决方案?
c - 即使 a 乘以 b 不适合这种类型,如何仅使用 32 位整数类型计算 (a 乘以 b) 除以 c
考虑以下作为参考实现:
我对不需要 64 位整数类型的实现(在 C 或伪代码中)感兴趣。
我开始草拟一个概述如下的实现:
但困难在于为 d1 和 d2 选择能够避免溢出的值 ((a / d1) * (b / d2) <= UINT32_MAX) 并最大限度地减少整个计算的错误。
有什么想法吗?