C 或 C++ 中乘法和除法的较高部分?

2024-02-13

当我在汇编中将一对 4 字节整数相乘时,结果的较低部分在 EAX 中,较高部分在 EDX 中。如果我使用 C 或 C++ 并且我想获得更高的部分,是否可以不使用内联汇编?

是否可以以同样的方式从 EAX 获得整数除法结果,从 EDX 获得模数结果,而无需在 C 或 C++ 中重复除法?我其实只知道先做a/b进而a%b,而在汇编程序中,两个结果都是在同一操作中给出的。


你可以用 C 语言这样轻松地做到这一点:

#include <stdint.h>

uint32_t a, b;  // input
uint64_t val = (uint64_t)a * b;
uint32_t high = val >> 32, low = val;

让编译器生成尽可能最好的代码。现代优化器确实很擅长。手工编码的程序集通常看起来更好但性能更差。

正如 Pete Becker 所评论的,上述内容取决于类型的可用性uint32_t and uint64_t。如果您坚持顽固的可移植性(假设您正在DS9K),您可以改为使用类型uint_least32_t and uint_least64_t or uint_fast32_t and uint_fast64_t在 C99 下始终可用,但您需要一个额外的掩码,如果不需要,它将被优化:

#include <stdint.h>

uint_fast32_t a, b;  // input
uint_fast64_t val = (uint_fast64_t)a * b;
uint_fast32_t high = (val >> 32) & 0xFFFFFFFF, low = val & 0xFFFFFFFF;

关于除法,可以使用C99库函数div, ldiv or lldiv在一次调用中执行有符号除法和余数运算。如果可能的话,在特定操作数类型的目标架构上,除法/模组合将在一次操作中实现。

编写两个表达式并依靠编译器来检测模式并生成使用单个 IDIV 操作码的代码可能会更有效:

struct divmod_t { int quo, rem; };
struct divmod_t divmod(int num, int denom) {
    struct divmod_t r = { num / denom, num % denom };
    return r;
}

测试于Matt Godbolt 的编译器浏览器 https://godbolt.org/g/oOvl17显示 clang 和 gcc 都生成一个idiv该代码的说明位于-O3.

您可以将这些除法之一转化为乘法:

struct divmod_t { int quo, rem; };
struct divmod_t divmod2(int num, int denom) {
    struct divmod_t r;
    r.quo = num / denom;
    r.rem = num - r.quo * denom;
    return r;
}

请注意,上述函数不会检查潜在的溢出,这会导致未定义的行为。如果发生溢出denom = 0 and if num = INT_MIN and denom = -1.

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

C 或 C++ 中乘法和除法的较高部分? 的相关文章

  • 将 new 与 decltype 一起使用

    T t T is an implementation detail t new T want to avoid naming T to allow for flexibility t new decltype t error cannot
  • Poco c++Net:Http 从响应中获取标头

    我使用 POCO C Net 库进行 http 我想尝试制定持久缓存策略 首先 我认为我需要从缓存标头中获取过期时间 并与缓存值进行交叉检查 如果我错了 请告诉我 那么我如何从中提取缓存头httpResponse 我已经看到你可以用 Jav
  • 单元测试验证失败

    我正在运行我的单元测试PostMyModel路线 然而 在PostMyModel 我用的是线Validate
  • 在路由mvc 4中添加公司名称

    我一直在尝试为 Facebook 等用户提供在 URL 中添加公司名称的选项 http localhost 50753 MyCompany Login 我尝试过不同的网址 但没有成功 routes MapRoute name Default
  • 如何在另一个应用程序中挂钩 api 调用

    我正在尝试挂钩另一个应用程序的 ExtTextOut 和 DrawTextExt GDI 方法调用 我知道我需要使用 GetProcAddress 来查找 gdi32 dll 中那些方法的地址 并用我的函数的地址覆盖我想要挂钩的进程中的地址
  • 在 Java 中创建 T 的新实例

    在C 中 我们可以定义一个泛型class A
  • 解析 JWT 令牌以仅获取有效负载内容,无需 C# 或 Blazor 中的外部库

    我正在使用 Blazor 编写可以访问 JWT 的客户端应用程序 我想知道一种简单的方法来读取令牌有效负载内容而不添加额外的依赖项 因为我不需要其他信息 也不需要验证令牌 我认为解析有效负载内容应该足够简单 只需将其写入方法即可 JwtTo
  • linq 中使用字符串数组 c# 的 'orderby'

    假设我有一个这样的方法定义 public CustomerOrderData GetCustomerOrderData string CustomerIDs var query from a in db Customer join b in
  • 从代码中,如何创建对存储在附加属性中的对象的属性的绑定?

    我们有一个继承的附加属性来存储一个对象 在可视化树的更下方 我们希望从代码绑定到该对象的属性 通常我们像这样构建绑定的路径部分 var someBinding new Binding Path new PropertyPath Attach
  • C# 5 async/await 线程机制感觉不对?

    为什么让调用线程进入异步方法直到内部 等待 一旦调用异步方法就生成一个线程 这不是更干净吗 这样您就可以确定异步方法会立即返回 您不必担心在异步方法的早期阶段没有做任何昂贵的事情 我倾向于知道某个方法是否要在 我的 线程上执行代码 不管是堵
  • 为什么'enable_if'不能用于禁用这里声明

    include
  • 访问 ascx 文件中的母版页控件

    我有一个母版页文件 其中包含 2 个面板控件中的 2 个菜单 我还使用控件来检查用户是否登录并获取用户类型 根据我想要显示 隐藏面板的类型 控件本身不在母版页中引用 而是通过 CMS 系统动态引用 我想在用户控件中使用findcontrol
  • 增强精神、递归和堆栈溢出

    为什么下面的代码在运行时崩溃 它会给出堆栈溢出错误 include
  • 如何在三个 IEnumerable 上使用 Zip [重复]

    这个问题在这里已经有答案了 可能的重复 使用 Linq 从 3 个集合创建项目 https stackoverflow com questions 5284315 create items from 3 collections using
  • 在 asp.net MVC 中使用活动目录进行身份验证

    我想使用活动目录对我的 asp net mvc 项目中的用户进行身份验证 在网上冲浪了几个小时后 我没有找到任何对我有用的东西 我已经看到了所有结果 但什么也没有 我尝试按照许多帖子的建议编辑我的 web config 如果有人可以帮助我提
  • 从BackgroundWorker线程更新图像UI属性

    在我正在编写的 WPF 应用程序中 我有一个 TransformedBitmap 属性 该属性绑定到 UI 上的 Image 对象 每当我更改此属性时 图像就会更新 因此显示在屏幕上的图像也会更新 为了防止在检索下一张图像时 UI 冻结或变
  • 英文日期差异

    接近重复 如何计算相对时间 https stackoverflow com questions 11 how do i calculate relative time 如何在 C 中计算某人的年龄 https stackoverflow c
  • ASP.NET MVC 路由:如何从 URL 中省略“索引”

    我有一个名为 StuffController 的控制器 具有无参数索引操作 我希望从表单中的 URL 调用此操作mysite com stuff 我的控制器定义为 public class StuffController BaseContr
  • 使用 jQuery 从 ASP.Net JSON 服务获取数据

    我正在尝试调用 Google 地图地理编码 API 从纬度 经度对中获取格式化的地址 然后将其记录到控制台 我正在尝试获取为给定位置返回的第一个 formatted address 项目 我很简单无法从 JSON 中提取该项目 我不知道为什
  • 使用未分配的局部变量

    我遇到了一个错误 尽管声明了变量 failturetext 和 userName 错误仍然出现 谁能帮帮我吗 Use of Unassigned local variable FailureText Use of Unassigned lo

随机推荐

  • Android dex2oat build:错误:Dex2oat 无法编译启动映像

    构建安卓9 0 错误 Dex2oat 无法编译启动映像 引导类路径可能不一致 使用 ART BOOT IMAGE EXTRA ARGS runtime arg verbose 重建 验证程序以查看验证错误 只需禁用优化sse4 2 popc
  • 为什么结构中的 Box 需要“显式生命周期限制”?

    编者注 此代码在之后不再产生相同的错误RFC 599 https github com rust lang rfcs blob master text 0599 default object bound md已实施 但答案中讨论的概念仍然有
  • 使用 Angularjs 加载文本的 Bootstrap 按钮

    在使用 bootstrap 和 jquery 的非角度应用程序中 我可以创建如下按钮
  • http://timestamp.geotrust.com/tsa 是否不再可用于 SignTool?

    我们在构建服务器上签署可执行文件 突然构建服务器无法构建并给出错误 SignTool 错误 无法到达指定的时间戳服务器或返回无效响应 将时间戳服务器更改为后http sha256timestamp ws symantec com sha25
  • 使用“printf”返回字符串,而不是打印它

    这可能听起来很奇怪 但事实就是如此 我喜欢使用这种在 php 中构建字符串的技术 printf This is 1 s this is 2 s myFunction1 myFunction2 显然 每当调用函数时 这都会直接打印结果 但我想
  • 有没有办法在Windows中模拟LD_LIBRARY_PATH?

    我有一个程序可以做一些图形 当我以交互方式运行它时 我希望它使用系统中的 OpenGL 来提供硬件加速图形 当我批量运行它时 我希望能够将其重定向以使用 Mesa GL 库 以便我可以使用 OSMesa 功能渲染到屏幕外缓冲区 如果选择了批
  • 如何在 VBA 2010 上导出图像之前裁剪图像

    我有一个子例程可以很好地导出从 Excel 中的某个范围内获取的图像 但我遇到了一个问题 即使我设法使图表对象透明并且没有边框 导出的图像有一个我希望在导出之前裁剪很多未使用的区域 Sub BtnSaveFile Click Dim RgE
  • 努力在 Glassfish 上创建 MySQL 连接池

    我以前已经这样做过 但由于某种原因 我在创建这个连接池时确实遇到了一些困难 当我在创建连接池后 ping 连接池时 出现以下错误 Ping Connection Pool for bondsaver is Failed Ping faile
  • 远程连接 Neo4j 服务器

    我相信创建远程连接的方法是更改 此行conf neo4j server properties 特别是删除注释并重新启动服务器 org neo4j server webserver address 0 0 0 0 我的网址是https 0 0
  • 启动 Nexus docker 镜像时如何设置管理员用户/密码

    当在 Nexus 2 docker 镜像中启动时 https hub docker com r sonatype nexus https hub docker com r sonatype nexus 如何配置它以将默认管理员用户密码更改为
  • 在 Clojure 中搜索 xml

    我有以下示例 xml
  • 有没有办法在 Protractor 测试中绕过 Chrome 地理定位对话框?

    在使用量角器自动化应用程序时 我遇到了这个问题 打开主页后 我会看到带有 阻止 允许 按钮的地理位置对话框 如果不选择任一选项 该对话框就无法继续 事实证明 这个对话框不是警报的实例 这就是为什么browser switchTo alert
  • 新 Activity 的 onStart 在父 Activity 的 onStop 之前调用

    我有一份申请 我用startActivity 开始活动 谁能真正告诉我为什么系统会调用onStart 首先是新 Activity 而不是父活动onStop 这可能吗 没有系统错误 我找到了在 onStart 之后直接调用 Fragment
  • 从文件生成频率表

    给定一个每行包含一个数字的输入文件 我如何计算某个项目在该文件中出现的次数 cat input txt 1 2 1 3 1 0 期望的输出 gt 1 3 1 1 cat output txt 0 1 1 3 2 1 3 1 如果该解决方案也
  • Postgres SELECT 数组中的值

    我有一个看起来像这样的 postgres 表 缩短 id serial col1 character varying 1 Life Health VA Data 我正在尝试执行以下操作 SELECT FROM mytable WHERE L
  • 析构函数的执行顺序?

    我知道c 中的析构函数没有执行顺序 我在几个类中使用以下结构 它是为了破坏实例和静态信息 public class MyClass private static readonly Destructor DestructorObject ne
  • =importXML() 中的 xpath 用于提取元描述

    我正在尝试使用 Xpath 使用 Google Sheets 从网页中提取元描述 我正在努力提取标题 importXml www example com title 以下是我的两个学习来源 http seogadget co uk play
  • 简单 MySQL 子查询性能

    考虑 2 个 MySQL 查询 SELECT ue userid e courseid FROM SELECT id courseid FROM mdl enrol WHERE status 0 AND courseid IN 46 e I
  • 使用 ADO .NET 调用 SQL 函数

    我想要在 SQL Server 中创建调用函数 它接收两个参数并返回一个整数 当我调用存储过程时 我使用以下代码 sqlcmd CommandType CommandType StoredProcedure sqlcmd CommandTe
  • C 或 C++ 中乘法和除法的较高部分?

    当我在汇编中将一对 4 字节整数相乘时 结果的较低部分在 EAX 中 较高部分在 EDX 中 如果我使用 C 或 C 并且我想获得更高的部分 是否可以不使用内联汇编 是否可以以同样的方式从 EAX 获得整数除法结果 从 EDX 获得模数结果