如何检测 2 的补码乘法溢出?

2024-03-28

在我正在阅读的一本书中,以下函数用于确定 2 的补码整数乘法溢出。

int tmult_ok(int x, int y) {
int p = x*y;
return !x || p/x == y;
}

虽然这有效,但我如何证明它在所有情况下的正确性? 当发生溢出时如何确保 p != x*y ?

这是我的理解:

  1. 当您将 2 个大小为“w 位”的整数相乘时,结果可以是 2w 位。
  2. 计算会截断高阶 w 位。所以我们剩下低阶 w 位。 3.假设 P = 最低 w 位
  3. 然后,我们需要证明(P/x != y)和(P/y !=x)当发生溢出时。
  4. 我的困惑就在这里。当没有溢出时,你怎么能说(P/x !=y)呢?即使存在溢出,P 的位模式除以 x 也可能产生 y 吗?

tmult_ok(x, y)随时失败x*y in int p = x*y;就这样溢出了未定义的行为 (UB).
它也失败了像这样的极端情况tmult_ok(INT_MIN, -1)为了同样的原因。
它不能便携地“工作”。

另一种选择(和其他为 /、-、+ https://codereview.stackexchange.com/a/93699/29485) 不依赖于 2 的补码。请注意,这会返回相反的结果tmult_ok().

int is_undefined_mult1(int a, int b) {
  if (a > 0) {
    if (b > 0) {
      return a > INT_MAX / b;       // a positive, b positive
    }
    return b < INT_MIN / a;         // a positive, b not positive
  }
  if (b > 0) {
    return a < INT_MIN / b;         // a not positive, b positive
  }
  return a != 0 && b < INT_MAX / a; // a not positive, b not positive
}

当发生溢出时如何确保 p != x*y ?

可移植代码不能。对于 C 中的有符号整数数学,溢出为 UB。代码应该在不首先执行乘法的情况下检测潜在的溢出。@Quentin https://stackoverflow.com/questions/50684187/how-do-you-detect-2s-complement-multiplication-overflow/50684646#comment88378418_50684187 @尤金·什。 https://stackoverflow.com/questions/50684187/how-do-you-detect-2s-complement-multiplication-overflow/50684646#comment88379482_50684187


我如何证明它在所有情况下的正确性?

使用 2x 宽数学形成参考测试。如果int是32位的,比较一下tmult_ok()使用 64 位数学进行乘法,并查看乘积是否在范围内。@rici https://stackoverflow.com/questions/50684187/how-do-you-detect-2s-complement-multiplication-overflow/50684646#comment88379605_50684187

int tmult_ok_ll(int x, int y) {
  long long prod = x;
  prod *= y;
  return (prod >= INT_MIN && prod <= INT_MAX);
}

尝试所有组合是一种蛮力方法 - 对于 32 位来说可能太长int.

尝试所有组合的子集,对于每个x,y,try INT_MIN, INT_MIN-1, INT_MIN-2, -2,-1, 0, 1, 2, , INT_MAX-1, INT_MAX。 (10*10测试)

也是所有组合的子集,每个值 +/- 在 2 以内sqrt(INT_MAX)。 (10*10测试)

还有几百万个随机值int范围将是谨慎的。

这可能还不够,但如果代码通过了这一点,那么剩下的极端情况就很少了——这非常依赖于您的源代码。

也可以看看@埃里克·波斯特皮斯基尔 https://stackoverflow.com/questions/50684187/how-do-you-detect-2s-complement-multiplication-overflow?noredirect=1#comment88380237_50684646

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

如何检测 2 的补码乘法溢出? 的相关文章

  • 具有可绑定属性的自定义视图未在 Xamarin.Forms SAP 上正确绑定

    我有一个复选框 应该触发按钮的 IsEnabled 事件 但不知何故 应该执行的命令永远不会正确绑定并因此执行 这是 CheckBox xaml cs 控件 中的可绑定属性 public static readonly BindablePr
  • Accept() 是线程安全的吗?

    我目前正在用 C 语言为我正在做的课程编写一个简单的网络服务器 我们的一项要求是实现一个线程池来使用 pthread 处理连接 我知道我将如何粗略地执行此操作 在主线程中调用accept并将文件描述符传递给freee线程 但是我的朋友建议了
  • 如何从RichTextBox中获取显示的文本?

    如何获得显示的RichTextBox 中的文本 我的意思是 如果 RichTextBox 滚动到末尾 我只想接收那些对我来说可见的行 P S 获得第一个显示的字符串就足够了 您想使用 RichTextBox GetCharIndexFrom
  • 为什么 VB.NET 和 C# 中针对值检查 null 存在差异?

    In VB NET http en wikipedia org wiki Visual Basic NET有时候是这样的 Dim x As System Nullable Of Decimal Nothing Dim y As System
  • 将图像文件从网址复制到本地文件夹?

    我有该图像的网址 例如 http testsite com web abc jpg http testsite com web abc jpg 我想将该 URL 复制到 c images 中的本地文件夹中 而且当我将该文件复制到文件夹中时
  • C# 中四舍五入到偶数

    我没有看到 Math Round 的预期结果 return Math Round 99 96535789 2 MidpointRounding ToEven returning 99 97 据我了解 MidpointRounding ToE
  • 静态类变量与外部变量相同,只是具有类作用域吗?

    在我看来 静态类变量与外部变量相同 因为你只需要declare它在static int x extern int x语句 并在其他地方实际定义它 通常在 cpp 文件中 静态类变量 h file class Foo static int x
  • 访问“if”语句之外的变量

    我怎样才能使insuranceCost以外可用if陈述 if this comboBox5 Text Third Party Fire and Theft double insuranceCost 1 在 if 语句之外定义它 double
  • 如何在不实例化一个类的情况下检查它是否继承了另一个类? [复制]

    这个问题在这里已经有答案了 假设我有一个如下所示的类 class Derived some inheritance stuff here 我想在我的代码中检查类似的内容 Derived is SomeType 但看起来像is运算符需要 De
  • 从 future 中检索值时的 SIGABRT

    我在使用 C 11 future 时遇到问题 当我打电话时wait or get 关于返回的未来std async 程序接收从mutex标头 可能是什么问题呢 如何修复它 我在 Linux 上使用 g 4 6 将以下代码粘贴到 ideone
  • Qt 计算和比较密码哈希

    目前正在 Qt 中为测验程序构建面向 Web 的身份验证服务 据我了解 在数据库中存储用户密码时 必须对其进行隐藏 以防落入坏人之手 流行的方法似乎是添加的过程Salt https en wikipedia org wiki Salt cr
  • 我可以仅在少数情况下关闭模拟吗

    我有一个始终使用模拟的应用程序 但是 当用户以管理员身份登录时 一些操作需要他们写入服务器本身 现在 如果这些用户在实际服务器上没有权限 有些用户没有 则不会让他们写入 我想做的是关闭几个命令的模拟 有没有办法做这样的事情 using Ho
  • 无法加载文件或程序集“EntityFramework,版本=6.0.0.0”

    我究竟做错了什么 我该如何解决这个问题 我有一个包含多个项目的解决方案 它是一个 MVC NET 4 5 Web 应用程序 在调试模式下启动后调用其中一个项目时 出现此错误 导致此错误的项目具有以下参考 两个都是版本6 0 0 0 应用程序
  • 在VisualStudio DTE中,如何获取ActiveDocument的内容?

    我正在 VisualStudio 中编写脚本 并尝试获取当前 ActiveDocument 的内容 这是我当前的解决方案 var visualStudio new API VisualStudio 2010 var vsDTE visual
  • 允许使用什么类型的内容作为 C 预处理器宏的参数?

    老实说 我很了解 C 编程语言的语法 但对 C 预处理器的语法几乎一无所知 尽管我有时在编程实践中使用它 所以问题来了 假设我们有一个简单的宏 它扩展为空 define macro param 可以放入宏调用构造中的语法有哪些限制 调用宏时
  • 使用(linq to sql)更新错误

    我有两个表 通过外键 CarrierID 绑定 Carrier CarrierID CarrierName CarrierID 1 CarrierName DHL CarrierID 2 CarrierName Fedex Vendor V
  • 如何使用收益返回和递归获得字母的每个组合?

    我有几个像这样的字符串列表 可能有几十个列表 1 A B C 2 1 2 3 3 D E F 这三个仅作为示例 用户可以从几十个具有不同数量元素的类似列表中进行选择 再举个例子 这对于用户来说也是一个完全有效的选择 25 empty 4 1
  • “int i=1,2,3”和“int i=(1,2,3)”之间的区别 - 使用逗号运算符的变量声明[重复]

    这个问题在这里已经有答案了 int i 1 2 3 int i 1 2 3 int i i 1 2 3 这些说法有什么区别 我无法找出任何具体原因 Statement 1 Result Compile error 运算符的优先级高于 运算符
  • 使用 Chrome 和 Selenium 设置 LocalStorage

    我正在尝试使用 OpenQA Selenium 和 Chrome 设置本地存储键和值 我认为这相当微不足道 但我似乎无法让它发挥作用 我对 C 很陌生 所以我可能错过了一些东西 无论如何 我有这个功能 public static void
  • 启动画面后主窗口出现在其他窗口后面

    我有一个带有启动屏幕的 Windows 窗体应用程序 当我运行该应用程序时 启动屏幕显示正常 消失并加载应用程序的主窗体 但是 当我加载主窗体时 它出现在包含该应用程序的 Windows 资源管理器目录下 这是运行启动画面然后运行主窗体的代

随机推荐

  • 在fabricJS中以相同的左原点缩放时保持相同的对象大小

    我见过这个帖子 https stackoverflow com questions 48578974 maintaining object size while zooming in fabric js并尝试仅使用 X 缩放来完成我自己的功
  • 如何使用 jquery 判断 gif 是否已完全动画化

    如果我有一个仅运行单个动画的 IE 动画 gif 它不循环 有没有办法使用 jquery 或任何与此相关的东西来告诉动画何时完成 我不想告诉文件是否已完全加载 但动画已经运行完毕 我认为没有办法从 JavaScript 中检测到它 我会选择
  • 如何解压 Pandas 中的一系列元组?

    有时 在使用 Pandas 时 我最终会得到一系列元组 列表 例如 当执行分组并传递具有多个返回值的函数时 这种情况很常见 import numpy as np from scipy import stats df pd DataFrame
  • ConstraintLayout 无法转换为 android.widget.TextView

    当我尝试启动活动时 不断收到运行时错误 发生错误的行 private OnItemClickListener mDeviceClickListener new OnItemClickListener public void onItemCl
  • 在 Java 应用程序中查找线程创建的来源

    我正在开发一个存在线程问题的 Java 应用程序 在使用带有 Netbeans 分析器的应用程序一段时间时 我可以看到创建了多个线程 他们中的大多数人都以某种方式完成 5 seconds 我只能找到应用程序中使用的 SwingWorkers
  • 如何在 Maven Shade 插件中设置清单类路径?

    我正在使用阴影插件 除了能够通过设置清单的类路径之外 一切正常
  • QMainWindow::splitDockWidget 的 QDockWidget 拉伸因子?

    我正在使用 QMainWindow 在 C 中手动布局 Qt 应用程序 我想要在屏幕底部有两个并排停靠的小部件 但我希望它们具有不成比例的宽度 目前 我只能让它们具有相同的宽度 有没有办法设置拉伸因子或其他机制来获得不均匀的码头分割 以下是
  • 显示所有数据库名称

    有没有办法使用主机地址和端口显示所有数据库名称 喜欢SELECT current database 显示当前连接的数据库 我需要显示所有数据库名称 提前致谢 有一个表显示所有数据库 SELECT FROM pg database
  • 使用express.js 处理猫鼬连接的正确方法是什么?

    我有一个非常简单的 server js 设置 我正在尝试运行 var express require express wines require routes testscripts var app express app get firs
  • 关于如何制作影响 Angular 中所有组件的主题机制的指南?

    问题 我需要有关如何在 Angular 中编写机制以在我的应用程序中全局设置组件的 外观和感觉 的指导 请注意 我正在努力学习 ngrx 平台 https github com ngrx platform我认为这将是一个有趣的设计约束 然而
  • 为什么 tabindex='-1' 阻止键盘

    经过几个小时的尝试找出键盘输入在引导模式中不起作用的原因后 我终于成功地找出了问题 这是我从未想到过的事情 但通过纯粹的消除过程发现了它 有了tabindex 1 存在于 div 对于引导程序中的模态 它完全停止键盘输入 我本以为数据属性d
  • 在 Laravel 5 中安装 Guzzle

    如何将 Guzzle 安装到 Laravel 5 中 我在我的项目中使用 laravel 但我需要像 guzzle 这样的库来让我在 laravel 中轻松使用curl 任何机构可以帮忙吗 打开终端 切换到你的 laravel 项目根目录并
  • 检索 DynamoDB 上以指定文本开头的列的所有项目

    我在 DynamoDB 中有一个表 Id int hash key Name string 还有很多列 但我省略了 通常 我只是根据项目的 ID 提取和更新项目 这个模式非常适合这种情况 然而 要求之一是有一个基于名称的自动完成下拉框 我希
  • ANTLR 4 - 树模式匹配

    我试图理解 ANTLR 4 中的解析树匹配 所以为此 我有以下java代码 package sampleCodes public class fruits public static void main String args int a
  • 如何检查正则表达式是否完全匹配字符串,即字符串不包含任何额外字符?

    我有两个问题 1 我有一个正则表达式 A Z a z 0 2 d 我正在使用Python的re finditer 匹配适当的字符串 我的问题是 我只想匹配不包含额外字符的字符串 否则我想引发异常 我想捕捉以下模式 大写字母 后跟 0 1 或
  • 如何从一个 Instagram 帐户获取关注者列表?

    我正在建立一个网站 我需要的只是一个 Instagram 帐户的关注者列表 我已经完成了使用 auth 2 0 验证我的网络应用程序的步骤 我刚刚意识到 通过此身份验证 我只能访问每个访问令牌所属帐户的关注者 有没有其他方法可以从我想要的帐
  • 如何在 ubuntu 12.04 中安装 python-matplotlib?

    当我尝试时 sudo apt get install python matplotlib 我收到以下错误 Reading package lists Done Building dependency tree Reading state i
  • `yield from foo()` 和 `for x in foo(): Yield x` 之间的区别

    在Python中 大多数yield from的例子都是这样解释的 yield from foo 类似于 for x in foo yield x 另一方面 它似乎并不完全相同 并且有一些魔法 我对使用一个执行我不理解的魔法的函数感到有点不安
  • 无法使用 Require.js 调用函数

    我尝试使用 require js 为我的 node js 服务器编写一个模块 它只返回我想从 url 获取的对象 但不知何故 我无法返回用我的方法获得的值 http get 在我返回值后执行 所以我只是得到 未定义 但为什么呢 请你帮助我好
  • 如何检测 2 的补码乘法溢出?

    在我正在阅读的一本书中 以下函数用于确定 2 的补码整数乘法溢出 int tmult ok int x int y int p x y return x p x y 虽然这有效 但我如何证明它在所有情况下的正确性 当发生溢出时如何确保 p