Tag: 整数溢出

BigInteger没有限制意味着什么?

我看着这个与大整数有关的stackoverflow问题 ,特别是我不明白这行(斜体字): 在BigInteger类中, 我没有任何限制,并且有一些有帮助的function,但是将漂亮的代码转换为BigInteger类,特别是在基本运算符不在那里工作,而且必须使用这个类的函数。 我不知道我在想什么,但是要expression一些没有限制的东西,你需要无限的记忆? 这里有什么窍门?

当整数列上的auto_increment达到数据库中的max_value时会发生什么?

我正在实现一个数据库应用程序,我将同时使用JavaDB和MySQL作为数据库。 我在我的表中有一个ID列作为types​​的整数,我使用数据库的auto_increment函数的值。 但是,当我得到超过2(或4)亿个post和整数是不够的? 是整数溢出,并继续或是一个exception抛出,我可以处理? 是的,我可以改变只要数据types,但如何检查什么时候需要? 我认为,如果我使用long作为ID列的数据types,那么获取last_inserted_id()函数会有问题。

整数溢出导致未定义的行为,因为内存损坏?

我最近读了C和C ++中的有符号整数溢出导致未定义的行为: 如果在expression式评估过程中,结果不是math定义的,或者不在其types的可表示值范围内,则行为是未定义的。 我目前正试图了解这里未定义行为的原因。 我以为未定义的行为发生在这里,因为当它变得太大而不适合底层types时,整数开始操作内存。 所以我决定在Visual Studio 2015中编写一个testing程序,用下面的代码来testing这个理论: #include <stdio.h> #include <limits.h> struct TestStruct { char pad1[50]; int testVal; char pad2[50]; }; int main() { TestStruct test; memset(&test, 0, sizeof(test)); for (test.testVal = 0; ; test.testVal++) { if (test.testVal == INT_MAX) printf("Overflowing\r\n"); } return 0; } 我在这里使用了一个结构来防止Visual Studio在debugging模式下的任何保护性问题,比如临时填充栈variables等等。 无限循环应该会引起test.testVal多次溢出,而且确实是这样,除了溢出本身之外没有其他任何后果。 我在运行溢出testing时看到了内存转储,结果如下( test.testVal的内存地址为0x001CFAFC ): 0x001CFAE5 00 00 […]

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

在C#中我看到了 -1 * int.MinValue == int.MinValue 这是一个错误? 当我试图实现一个search树时,它真的把我搞砸了。 我结束了使用(int.MinValue + 1)以便我可以正确否定它。

这是一个JVM的错误或“预期的行为”?

我注意到一些意想不到的行为(与我个人的期望相关),我想知道如果JVM中有一个错误,或者这是一个附带案例,我不明白什么是什么细节应该会发生。 假设我们在主要方法中有以下代码: int i; int count = 0; for(i=0; i < Integer.MAX_VALUE; i+=2){ count++; } System.out.println(i++); 一个天真的期望是,这将打印Integer.MAX_VALUE-1 ,最大的偶数可表示的int 。 不过,我相信整数算术应该在Java中“滚动”,所以将1加到Integer.MAX_VALUE应该导致Integer.MIN_VALUE 。 由于Integer.MIN_VALUE仍然小于Integer.MAX_VALUE ,所以循环会持续迭代负整数。 最终它会回到0,这个过程应该重复为一个无限循环。 当我真的运行这个代码时,我得到了非确定性的结果。 打印的结果往往是五十万的数量级,但确切的数值是变化的。 所以当我相信它应该是一个无限循环时,不仅循环终止,而且似乎随机终止。 这是怎么回事? 我的猜测是,这是JVM中的一个错误,或者有很多时髦的优化,使得这种预期的行为。 这是哪个?

如果32位整数溢出,我们可以使用40位结构而不是64位长结构吗?

如果一个32位的整数溢出,而不是将int升级为long ,那么如果我们只需要一个范围在2 40内,就可以使用一些40位的types,这样我们就可以节约24(64-40)位为每个整数? 如果是这样,怎么样? 我必须处理数十亿的空间是一个更大的约束。

argc能溢出吗?

我在这里徘徊,看到了这个问题 。 然后我开始怀疑是否可以溢出argc。 标准说argv[argc]必须是一个空指针,但是如果argc溢出,这将是错误的。 (我写了一个小C程序和一个python脚本来testing它,但得到了一个MemoryError 。) 谢谢! 国际标准的基本原理 – 编程语言 – C§5.1.2.2.1 程序启动 argc和argv作为main参数的规范认可了大量的先前的实践。 argv[argc]必须是一个空指针,以便在列表的末尾提供冗余检查,同样也是基于惯例。

在循环中的什么地方整数溢出成为未定义的行为?

这是一个例子来说明我的问题,涉及一些更复杂的代码,我不能在这里发表。 #include <stdio.h> int main() { int a = 0; for (int i = 0; i < 3; i++) { printf("Hello\n"); a = a + 1000000000; } } 这个程序在我的平台上包含未定义的行为,因为第三个循环会溢出。 这是否使整个程序有未定义的行为,或者只有溢出实际发生后 ? 编译器是否可能解决了a 会溢出的问题,所以它可以声明整个循环是未定义的,即使它们都发生在溢出之前,也不打算运行printfs。 (标签C和C ++虽然不同,因为如果两种语言不同,我会对这两种语言的答案感兴趣)。

在解释型语言中使用非常大的整数时会出现意外的结果

我试图得到1 + 2 + … + 1000000000的总和,但是我在PHP和Node.js中得到了有趣的结果。 PHP $sum = 0; for($i = 0; $i <= 1000000000 ; $i++) { $sum += $i; } printf("%s", number_format($sum, 0, "", "")); // 500000000067108992 Node.js的 var sum = 0; for (i = 0; i <= 1000000000; i++) { sum += i ; } console.log(sum); // 500000000067109000 正确的答案可以使用计算 1 […]

在C / C ++中允许有符号的整数溢出

当他们变得太大时,我想要有符号整数溢出。 如何在不使用下一个最大的数据types(或者当我已经在int128_t时)实现这个function? 例如,使用8位整数19 * 12通常是260,但是我想要结果1 11 10 01 00与第9位切断,因此-27。