当前位置: 首页 > 面试题库 >

C:处理大量数字时避免溢出

董俊晖
2023-03-14
问题内容

我已经在C中实现了一些排序算法(用于对整数进行排序),并谨慎地uint64_t用于存储与数据大小有关的任何内容(因此还包括了计数器和填充物),因为该算法也应使用数千兆字节的数据集进行测试整数

这些算法应该很好,并且分配的数据量应该没有问题:数据存储在文件中,并且每次仅加载很少的块,即使将内存中的缓冲区阻塞为任意大小,也可以正常工作。

使用数据集最多4千兆字节(因此16GB数据)的测试可以正常工作(排序4Gint花了2228秒,约37分钟),但是当我们超过该值(即:8
Gints)时,该算法似乎没有停止(这是现在已经运行了大约16个小时)。

恐怕问题可能是由于整数溢出造成的,可能是循环中的计数器存储在32位变量上,或者也许我们正在调用一些可用于32位整数的函数。
还有什么呢?

有什么简单的方法可以检查运行时是否发生整数溢出?


问题答案:

这是特定于编译器的,但是如果您使用的是gcc,则可以在发生有符号积分溢出时进行编译-ftrapv以发出问题SIGABRT

例如:

/* compile with gcc -ftrapv <filename> */
#include <signal.h>
#include <stdio.h>
#include <limits.h>

void signalHandler(int sig) {
  printf("Overflow detected\n");
}

int main() {
  signal(SIGABRT, &signalHandler);

  int largeInt = INT_MAX;
  int normalInt = 42;
  int overflowInt = largeInt + normalInt;  /* should cause overflow */

  /* if compiling with -ftrapv, we shouldn't get here */
  return 0;
}

当我在本地运行此代码时,输​​出为

Overflow detected
Aborted


 类似资料:
  • 问题内容: 我想用datatyp uint8添加numpy数组。我知道这些数组中的值可能足够大,以至于发生溢出。所以我得到类似: 现在,a是。但是,我希望让uint8太大的值成为uint8允许的最大值,而不是溢出。所以我想要的结果是。 我可以使用以下代码获得此结果: 问题是我的数组很大,因此创建具有更大数据类型的第三个数组可能是内存问题。是否有一种快速且更节省内存的方式来实现上述结果? 问题答案:

  • 我正在开发一个windows应用程序,它以600Hz的频率从传感器接收数据。在五分之二的情况下,我的IO线程成功地从传感器读取4字节的数据,并将其传递给GUI线程。 问题是五次中有三次,QSerialPort有无法解释的超时,其中QSerialPort的waitForReadyRead()返回false和serial。errorString()有超时错误。在这种情况下,它将永远不会读取数据。如果我

  • 在使用 Java 的javax.imageio包读取图片并进行缩放处理后保存为新的图片文件时,偶尔会出现内存溢出的错误,该如何解决这个问题? 分批处理图片,每次处理 10 张图片,处理完一批后再处理下一批。但还是会出现这个问题,想问下还有别的处理办法吗

  • 问题内容: 要使用带有大量数字(100,000+)的Fermat基本性测试时需要的[模幂,它需要进行一些非常大的计算。 当我将两个大数相乘时(例如:62574和62574),PHP似乎将结果强制转换为浮点数。获取该模量的值将返回奇怪的值。 有什么方法可以使PHP正确执行这些计算?另外,还有另一种方法可以找到适用于大量数值的模量值吗? 问题答案: 出于某种原因,PHP中有两个处理任意长度/精度数字的

  • 我正在使用的SMS网关来响应客户传入的短信。 但是,我的处理需要相当长的时间(大约20秒),在此期间,我从Twilio收到一个超时。 我在想一个防止超时的方法。我怎样才能加快处理时间?耗时最长的部分是我上传一些图像。我在想我可以在不同的线程中启动这个过程。我的服务器只有一个核心,那么多线程会有好处吗?

  • 当我开始增加n:overflowerrror:long int太大而无法转换为float时,我得到了一个溢出错误 项变得非常大,而项变得非常小。基本上,我有一个大分子除以一个大分母。对如何计算这个有什么建议吗?我想过用对数和斯特林近似公式来表示n!无济于事。任何帮助将不胜感激!