C:负数和余数背后的数学

2024-02-04

这似乎是处理 Remainder/Mod 时被问到的第一件事,而我对此有点碰壁。我正在用一本教科书和一堆 C 代码自学编程。

鉴于我没有真正的教练说,“不,不。它实际上是这样工作的”,我想我应该在这里尝试一下。不过,我还没有找到数学部分的结论性答案。

所以......我的印象是这是一个非常罕见的情况,但我仍然想知道在闪亮的编译下面发生了什么。另外,这本教科书希望我根据 C89 标准提供使用负余数时可能的所有值。如果有人可以检查一下这个数学是否合理,那么问会不会很过分?

1) 9%4
9 - (2) * 4 = 1     //this is a value based on x - (x/y) * y
(2) * 4 + (1) = 9     //this is a check based on (x/y) * y + (x%y) = x

2) -9%4
9 - (2) * 4 = 1; 9 - (3) * 4 = -3   //these are the possible values
(2) * 4 + (1) = 9; (3) * 4 + (-3) = 9    //these are the checks

3) 9%-4
Same values as #2?? 

我尝试用表达式中的负数进行计算,结果得出了诸如 17 和 -33 之类的荒谬的东西。 #3 也是 1 和 -3 吗?

4) -9%-4
Same as #1??

在代数除法中,负号“取消”。他们在这里做同样的事情吗,还是还有其他事情发生?

我认为最让我困惑的是负面因素。我在学校(5-6 年前)学习代数的方式是,它们“依附于”数字。在编程中,既然它们是一元运算符,不是吗?示例:在 #2 上填写 x 值时,x = 9 而不是 x = -9。

我真诚地感谢任何帮助。


这里您需要余数的数学定义。

给定两个整数m, d,我们说r is the 的划分m and d if r满足两个条件:

  • 存在另一个整数k这样m == k * d + r , and
  • 0 <= r < d.

对于正数,在 C 中,我们有m % d == r and m / d == k,只需遵循上面的定义即可。

由定义可知3 % 2 == 1且3 / 2 == 1。
其他例子:

4 / 3 == 1 和 5 / 3 == 1,尽管 5.0/3.0 == 1.6666 (其中 将四舍五入为 2.0)。

4 % 3 == 1 和 5 % 3 == 2。

您也可以相信这个公式r = m - k * d,在 C 语言中写为:

m % d == m - (m / d) * d

然而,在标准C中,整数除法遵循以下规则:round to 0.
因此,使用负操作数 C 会提供与数学结果不同的结果。
我们会有:

(-4) / 3 == -1, (-4) % 3 == -1 (在 C 语言中),但在简单的数学中: (-4) / 3 = -2, (-4) % 3 = 2。

在简单的数学中,余数总是非负的,并且小于abs(d).
在标准 C 中,余数始终具有第一个操作数的符号。



 +-----------------------+
 |  m  |  d  |  /  |  %  |
 +-----+-----+-----+-----+
 |  4  |  3  |  1  |  1  |
 +-----+-----+-----+-----+
 | -4  |  3  | -1  | -1  |
 +-----+-----+-----+-----+
 |  4  | -3  | -1  |  1  |
 +-----+-----+-----+-----+
 | -4  | -3  |  1  | -1  |
 +-----------------------+
  

备注:此描述(反面情况)仅适用于标准 C99/C11。您必须小心您的编译器版本,并进行一些测试。

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

C:负数和余数背后的数学 的相关文章

随机推荐

  • 如何加载和解析 SVG 文档

    背景 有许多与读取和解析 SVG 路径相关的未解答问题 用Java读取svg路径数据的最简单方法 https stackoverflow com questions 21973777 回复 使用 batik svg 解析器解析 svg 文件
  • 如何获取 Invoke-AzureRmVMRunCommand 命令的输出流?

    我正在尝试运行以下命令 Invoke AzVMRunCommand ResourceGroupName instance ResourceGroupName Name instance Name CommandId RunPowerShel
  • Sequelize 设置时区进行查询

    我目前正在使用续集 with postgres在我的项目中 我需要更改查询 因此它返回带有时区偏移量的created at列 var sequelize new Sequelize connStr dialectOptions useUTC
  • DynamoDB query() 与 getItem() 基于索引进行单项检索

    如果我根据索引哈希键从表中检索单个项目 两者之间是否存在性能差异query or getItem getItem会更快 getItem通过哈希和范围键检索是 1 1 匹配 检索它所需的时间 因此性能 受到内部哈希和分片的限制 查询结果是对
  • 如何将 AJAX 成功变量存储为 AJAX 之外的变量?

    我使用 AJAX 来获取我命名为变量 myPubscore 的数据 现在我尝试将 myPubscore 发送到另一个 js 文件 myPubscore 在 Ajax 中打印得很好 但是当我在 sendResponse 之前打印时 我收到 事
  • 如何从数组中获取最多代表的对象

    我有一个包含一些对象的数组 并且有几个相似的对象 例如 水果 苹果 橙子 苹果 香蕉 香蕉 橙子 苹果 苹果 从该数组中获取最多代表的对象的最有效方法是什么 在这种情况下 它将是 apple 但是您将如何有效地计算它呢 不要重新发明轮子 在
  • google.load 导致 dom/screen 为空

    我正在尝试异步添加谷歌可视化 但遇到了问题 我已将范围缩小到导致问题的 google load 当 google load 部分 js 运行时 我得到一个空的屏幕 dom 任何人都知道我做错了什么 我也尝试过使用 google setOnL
  • 推送秘密变更集

    这可能看起来很矛盾 我知道秘密变更集应该是私有的 但是如果我想备份这些秘密变更集怎么办 我并行处理一些分支 有时我想推送一个分支 但不想推送其他分支 为了实现这一目标 我在不同的克隆中工作 但我讨厌那样 所以现在 Mercurial 有阶段
  • 全局授权过滤器不适用于 Swagger UI Asp.net Web Api

    我正在实施招摇的用户界面 https swagger io tools swagger ui 对于我的 Asp net WEB Api 项目 我使用默认值System Web Http AuthorizeAttribute 我已将其注册到我
  • 同一虚拟机中已存在另一个未命名的 CacheManager (ehCache 2.5)

    这就是我运行 junit 测试时发生的情况 Another CacheManager with same name cacheManager already exists in the same VM Please provide uniq
  • 让 foreach() 和 ggplot2 和谐相处

    我有一组调查数据 我想生成按受访者所在国家 地区分组的特定变量的图 到目前为止 我编写的生成绘图的代码是 countries lt isplit drones drones v3 foreach country countries dopa
  • 将 MapKit 用户坐标转换为屏幕坐标时遇到问题

    好吧 这实际上是一个线程中的三个不同的问题 1 我正在使用 void viewDidLoad super viewDidLoad mapView setFrame CGRectMake 100 100 520 520 mapView set
  • 在不知道 Clojure 中的键的情况下,如何将映射解构为键值对?

    假设我有一张这样的地图 a 1 b 2 c 3 我想像这样映射它 注意 非工作伪代码 mapcat fn key key a value value a println key key a n value value a 如果不先获取函数的
  • uvicorn 在 AWS Fargate 上 1-2 分钟后关闭

    我在 AWS Fargate 上使用 Python 3 10 1 和应用程序负载均衡器部署了 FastAPI 0 81 0 uvicorn 0 18 3 服务器在我的本地 Docker 中无限期地运行 如预期 但是在 AWS 上 应用程序总
  • 如何在 Laravel 5 中导入 symfony 进程类?

    我想知道如何在 laravel 5 中导入 symfony 进程类 我在 laravel 的控制台中使用了它 但显示错误 未找到 进程 类 use Symfony Component Process Process 这样你就可以使用 Pro
  • Java 对象序列化性能技巧

    我必须将一棵巨大的对象树 7 000 个 序列化到磁盘中 最初 我们用 Kodo 将这棵树保存在数据库中 但它会进行成千上万的查询才能将这棵树加载到内存中 并且会占用本地宇宙可用时间的很大一部分 我为此尝试了序列化 并且确实获得了性能改进
  • 将 Json 对象导出到文本文件

    我正在尝试编写一个 Json 对象 JsonExport 并且想将其内容写入文本文件 我正在使用 max4live 将数据从 Audio DAW 导出到 Json 以便导出到服务器 但之后我希望在文本文件中看到整个 Json 对象 var
  • 如何仅使用日期从 DATETIME 列中进行选择?

    我的表上有一个 DATETIME 列 用于存储创建记录的时间 我只想选择在特定日期创建的记录 如果我尝试 SELECT FROM myTable WHERE postedOn 2012 06 06 即使表中有很多行 它也不返回任何行post
  • 我们如何在 Angular 4 中获取 HttpClient 状态代码

    嗨 Angular 新手 我面临着获取 HTTP 状态代码的问题 该代码位于 HTTP 模块中 我可以使用轻松获取响应代码响应状态 但是当我使用HttpClient模块我无法获取response status 它显示找不到状态 那么 我怎样
  • C:负数和余数背后的数学

    这似乎是处理 Remainder Mod 时被问到的第一件事 而我对此有点碰壁 我正在用一本教科书和一堆 C 代码自学编程 鉴于我没有真正的教练说 不 不 它实际上是这样工作的 我想我应该在这里尝试一下 不过 我还没有找到数学部分的结论性答