检查 C 中的溢出

2024-03-01

让我们有

int a, b, c; // may be char or float, anything actually
c = a + b;

让int类型用4个字节表示。假设 a+b 需要比 4 个字节多 1 位(即,假设结果是 1 00....0(32 个零,二进制))。这将导致 C=0,并且我确信计算机的微处理器会设置某种溢出标志。 C 中有没有内置方法可以检查这一点?

我实际上正在构建一个 1024 位长的数字类型(例如,int 是一个 32 位长的内置数字类型)。我尝试使用具有 128 个元素的无符号字符类型数组。我还需要定义这些数字的加法和减法运算。我已经编写了加法代码,但我在减法方面遇到了问题。我不需要担心得到负结果,因为我调用减法函数的方式始终确保减法结果始终为正,但要实现减法函数,我需要以某种方式获得减数的 2 补码,这这是我自定义的 1024 位数字吗?

如果我的描述难以理解,我很抱歉。如果需要的话我会详细说明。我包含了加法函数和不完整减法函数的代码。这NUM_OF_WORDS是一个常量,声明为

#define NUM_OF_WORDS 128

如果您不理解我的问题或我的代码的任何部分,请告诉我。

PS:我不知道如何在此论坛中上传附件,因此我将引导您到另一个网站。我的代码可能在那里找到

点击本页的下载 http://www.murga-linux.com/puppy/viewtopic.php?t=66710

顺便说一句,我发现this http://c-faq.com/misc/intovf.html我打算更换INT_MAX by UCHAR_MAX因为我的 1024 位数字由 char 类型数组(8 位变量)组成 这项检查是否足以应对所有情况?

Update:

是的,我正在研究密码学。
我需要为 1024 位整数实现蒙哥马利乘法例程。
我也考虑过使用 GMP 库,但不知道如何使用它。
我查阅了教程,经过一些小的修改后,我能够在 VC++ 6 中构建 GMP 项目文件,这会产生很多 .obj 文件,但现在我不知道如何处理它们。
如果我可以编写自己的数据类型,那就太好了,因为它将让我完全控制自定义数据类型上的算术运算的工作方式,并且我还需要能够将其从 1024 位扩展到更大的数字未来。


如果您要添加无符号数字,那么您可以这样做

c = a+b;
if (c<a) {
  // you'll get here if and only if overflow has occurred
}

您甚至可能会发现您的编译器足够聪明,可以通过检查溢出或进位标志来实现它,而不是进行额外的比较。例如,我刚刚把这个喂给gcc -O3 -S:

unsigned int foo() {
  unsigned int x=g(), y=h();
  unsigned int z = x+y;
  return z<0 ? 0 : z;
}

并得到了代码的关键部分:

movl  $0,   %edx
addl  %ebx, %eax
cmovb %edx, %eax

您会注意到没有额外的比较指令。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

检查 C 中的溢出 的相关文章

随机推荐

  • 协方差在这里安全吗?

    class Food class Meat extends Food class Animal void feed Food f class Lion extends Animal void feed Meat m void foo Ani
  • 如何从 ManagedBean 获取 primefaces 数据表列顺序和宽度

    我正在使用 primefaces 4 0 JSF Mojarra 2 2 2 这是我的数据表代码
  • 如何解决 OpenSSL::Cipher::Cipher#encrypt 的弃用警告

    我刚刚将 Mac 升级到 Snow Leopard 并启动并运行了 Rails 环境 除了 OSX 之外 与我之前安装的唯一区别是我现在正在运行ruby 1 8 7 2008 08 11 patchlevel 72 universal da
  • 找不到页面 (404)

    Error Request Method GET Request URL http 192 168 100 10 accounts profile Using the URLconf defined in urls Django tried
  • 在无需访问 Internet 的情况下从 EC2 实例使用 AWS CLI

    有没有办法使用AWS CLI从EC2 linux实例调用不同的服务 例如SQS EC2 SNS 调用 AWS CLI 命令的 EC2 实例无法访问互联网 它位于私有子网中 它不使用互联网网关或 NAT Thanks 不可能 CLI 必须访问
  • 棘手的 CRC 算法

    我正在尝试找到适用于以下结果的 crc 字节串由 2 个字节组成 即 0xCE1E crc 是单个字节 即 0x03 byte crc CE1E 03 CE20 45 CE22 6F 0000 C0 0001 D4 FFFF 95 有人可以
  • Perl 的未来? (Perl 6,就业能力)

    我发现了一些相关的问题 比如Python 与 Perl https stackoverflow com questions 150043 python v perl 现已删除 和Perl 值得吗 https stackoverflow co
  • Google 地图上的多个标记:仅显示最后一个标记

    我在地图上显示多个标记时遇到问题 该代码首先循环遍历一个数组 然后对纬度 经度值进行反向地理编码 然后显示标记并将 infoWindow 的内容设置为返回的地址 我的代码如下 for var i 0 i lt useNowArray len
  • @tailrec 如何工作

    我已经使用并阅读了 tailrec注释具有尾递归方法 我浏览了许多解释它的链接 例如 它仅在自调用函数时有效 并且不应被覆盖等 到处都提到compiler optimizes 但是编译器做了什么魔法 概念来使其成为尾递归 对于下面的简单函数
  • 无法从 powershell 运行 Elixir 应用程序

    当我打字时iex S mix在 PowerShell 中我收到此错误 Invoke Expression A positional parameter cannot be found that accepts argument mix At
  • 每行后动态重复标题行

    如何在 gridview 的每一行之后重复标题行 您可以将代码添加到网格的 rowdatabound event 中 protected void GridView RowDataBound object sender GridViewRo
  • Extjs XTemplate 两个同级数组循环?

    我想将 XTempate 与以下 json 数据一起使用 在另一个数组中循环一个数组 var data name xxx rowTitleArr 1 2 3 colTitleArr a b c var tpl name
  • 如何压缩包含超过 12GB 数据的文件夹

    我需要压缩一个包含大量文件的文件夹 当我尝试在命令行中进行压缩时 它显示压缩错误 输入文件读取失败 我搜索网络并发现 ZIP 文件格式 仅处理可以的文件长度 包含在 32 位整数中 如果是这样 那么它一定是我收到错误的原因 因为我的文件夹大
  • 如何使用asihttprequest接受自签名证书

    我正在尝试获取自签名证书来使用我的应用程序 我现在正在使用 ASIHTTPRequest 库 如下所示 IBAction sendHttpsRequest Set request address NSMutableString databa
  • 现在 CGI 脚本有哪些用途?

    我非常熟悉一般的 Web 编程语言 但我现在使用的工具之一是 CGI 我只能说 CGI 脚本相当慢 CGI 如今仍然普遍使用吗 如果不是的话 被什么取代了 是否存在 CGI 仍然存在并被积极使用的利基功能 CGI是协议 它是创建动态页面最基
  • 使用循环合并和创建表

    我尝试搜索如何使用循环合并和创建多个表 但找不到我正在寻找的内容 我有四个表 表 1 1 1 2 1 3 和表 2 表1 1 1 2和1 3共享相同的列但具有不同的行 表 2 与表 1 1 1 2 和 1 3 具有相同的第一列 具体来说 表
  • 防止线程在处理异常后分离时调用 std::terminate()

    我有自己的线程类 旨在帮助安全地管理异常 它看起来像这样 为了简单起见 跳过了其他构造函数和互斥体 class ExceptThread public std thread public template
  • 打开磁力链接而不失去焦点

    javascript 或其他 有没有办法在浏览器失去焦点的情况下处理磁力链接 这有点像在后台打开一个选项卡而不离开当前页面 我最近遇到了类似的问题 并且能够通过在页面上创建命名框架并将其用作目标来解决该问题window open windo
  • 正则表达式:一次性获取没有扩展名的文件名?

    我只想使用正则表达式获取文件名 所以我一直在尝试简单的事情 例如 当然 只有当文件名具有一个扩展名时才有效 但如果是的话adfadsfads blah txt我只是想adfadsfads blah 我怎样才能用正则表达式做到这一点 关于大卫
  • 检查 C 中的溢出

    让我们有 int a b c may be char or float anything actually c a b 让int类型用4个字节表示 假设 a b 需要比 4 个字节多 1 位 即 假设结果是 1 00 0 32 个零 二进制