关于C语言取余运算的那些大坑

news2024/9/22 15:37:40

0.前言

您好,这里是limou3434的一篇个人博文,感兴趣的话您也可以看看我的其他文章,本次我想给您带来的是关于C语言操作符‘%’的一些奇怪现象以及背后的原理解释,本章用了一点点python语法(比如在python中“//”是整除的意思),即便您没有学过python也不影响阅读。

1.一些奇怪的现象

在编写C语言程序的时候,取余运算符‘%’的一些“奇怪”行为经常困惑着初学者。尤其是在使用其他语言的时候,‘%’的行为更是让人摸不着头脑,您可以先观察下面在Visual Studio 2022环境的和python 3.8.5环境中的‘%’的运算结果在哪里是不同的。

1.1.C语言下‘%’的运算结果

#include <stdio.h>
int main()
{
	int a = -10;
	int b = 3;
	printf("%d\n", a / b);//结果输出-3
	printf("%d\n", a % b);//结果输出-1
	return 0;
}

在这里插入图片描述

1.2.python下‘%’的运算结果

C:\Users\DELL>python
Python 3.8.5 (tags/v3.8.5:580fbb0, Jul 20 2020, 15:57:54) [MSC v.1924 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> -10//3 #在python中“//”是整除的意思
-4
>>> -10%3
2

1.2.不一样的地方

为什么运行的结果不一样,明明是同一串表达式不是么!?另外我们还能发现,C语言和python不仅仅是在‘%’的运算结果上不一样,甚至‘/’的运算结果都是不一样的,这就不得不让我们好奇了:这两种语言究竟是怎么实现‘%’和‘/’计算的???

2.取余/取模的计算细节

2.1.取整模式

首先我们先了解下不同的取整模式(怎么就扯到取整了?不要担心,您且往后看看便知)不过由于我们主要探讨的语言是C语言,所以下面我们使用C语言的四个库函数来详细讲解四种取整模式(这几个库函数的头文件都是math.h)

2.1.1.向零取整(C语言的默认模式)

向零取整是什么意思呢?我们可以把所有的浮点数想象在同一根数轴上,我们为了取整,将浮点数们往0这个点“靠近”,类似学生上体育课时,体育老师发出的号令:“以中间那位同学为‘基准’进行靠拢”
在这里插入图片描述

在C语言中库函数trunc可以达到向零取整的效果

#include <stdio.h>
#include <math.h>
int main()
{
	printf("%d %d", (int)trunc(2.9), (int)trunc(-2.9));
	return 0;
}//也是输出零向取整的结果“2 -2”

2.1.2.向负无穷取整

类似向零取整,向负无穷取整也是一样的道理,只不过这一次的”基准“是看不见的“负无穷”而已
在这里插入图片描述
在C语言中库函数floor可以达到向负无穷取整的效果

floor(-2.9);//-3.0 
floor(-2.1);//-3.0 
floor(2.9);//2.0 
floor(2.1);//2.0

2.1.3.向正无穷取整

类似前两种,向正无穷取整也是一样的道理,这一次的”基准“就是看不见的“正无穷”了
在这里插入图片描述
在C语言中库函数ceil可以达到向正无穷取整的效果

ceil(-2.9);//2.0
ceil(-2.1);//2.0
ceil(2.9);//3.0
ceil(2.1);//3.0

2.1.4.四舍五入取整

这个就比较简单了,就是大家平时熟悉的四舍五入,在C语言中库函数round可以达到四舍五入取整的效果

round(2.1);//2.0
round(2.9);//3.0
round(-2.1);//-2.0
round(-2.9);//-3.0

2.2.取余/取模的定义

2.2.1.数学中取余/取模的定义

对于整数 a 、 q 、 d 、 r ,其中 d 为非 0 ,有 a = q ∗ d + r ( 0 < = r < d ) ,其中 q 叫做商, r 叫做余数 对于整数a、q、d、r,其中d为非0,有a=q*d+r(0<=r<d),其中q叫做商,r叫做余数 对于整数aqdr,其中d为非0,有a=qd+r(0<=r<d),其中q叫做商,r叫做余数但是这可不行啊,C语言首先就不干了,为什么呢?回顾一下在C语言中“ − 10 % 3 = − 1 -10\%3=-1 10%3=1”这个例子,这个r(余数)小于0了,这不就不满足定义了吗?别急,我们可以试着引入负余数的概念,修改一下定义,让C语言也符合一下这个定义

2.2.2.修改后取余/取模的定义

对于整数 a 、 q 、 d 、 r ,其中 d 为非 0 ,有 a = q ∗ d + r ( 0 < = ∣ r ∣ < ∣ d ∣ ) ,其中 q 叫做商, r 叫做余数 对于整数a、q、d、r,其中d为非0,有a=q*d+r(0<=|r|<|d|),其中q叫做商,r叫做余数 对于整数aqdr,其中d为非0,有a=qd+r(0<=r<d),其中q叫做商,r叫做余数这样C语言的运算结果就也是符合定义的了

2.2.3.对于‘%’操作符在不同语言中的解释

  • 通过第二个定义,我们会发现余数会分为正余数和负余数,而“余数的大小”取决于“商q”,“商q”则取决于除法除法的“除法规则”,在语言里“除法规则”的本质就是“取整规则”。因此会发现,余数结果的不一样实际上是语言的取整规则在作怪!
  • 在厘清出一下:“除法规则”(“取整规则”)->“商q”->“余数的大小”,因此,只需要知道根据整除规则就可以得出“商q”了
    • 而C语言的取整规则默认是向零取整,因此“-10/3=-3(3.333…向零取整)”,再根据公式“-10=-3*3+r”,得到“r=-1”
    • python的取整规则默认是向负无穷取整,因此“-10/3=-4(3.333…向负无穷取整)”,再根据公式“-10=-4*3+r”,得到“r=2”
  • 因此我们成功明白了为什么‘%’在两种语言中得出不一样结果的原因!!!

2.4.“取余”和“取模”的区别

实际上“取余”和“取模”是两个概念:

  • 取余:尽可能让商进行向0取整,因此C语言的是取余,因此严格来说这个操作符%就叫“取余”
  • 取模:尽可能让商进行向-∞取整,因此python的是取模,因此严格来说这个操作符%就叫“取模”

2.5.“取余”和“取模”也有相等的时候

那么为什么平时我们不会去刻意区分这两个概念,甚至是混用呢?实际上我们不难发现,只要是操作数都是正数,在进行“取余/取模”运算,无论是哪一种,得到的结果都是一样的。因为对于正数来说,“向零取整”和“向负无穷取整”的方向得到的“商q”恰好是一样的,因此在正数的时候,可以直接简单粗暴的认为 “取余” = “取模” “取余”=“取模” 取余=取模,我们只需要在负数的时候区分开来就行了。

3.总结归纳

总结一下把,本次我们主要探讨了有关C语言和python语言中‘%’的区别,并且通过四种“取整模式”和“修改后的定义公式”得到“余数r”,并且揭示了为何不同语言经过‘%’操作符后所得结果不同的原因:不同语言默认的“取整模式”不同

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/511141.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++开发环境的搭建-Windows:VSCode+mingw64+CMake

文章目录 一、软件安装1. 网址及下载的软件2. VSCode中配置关于C的最简插件&#xff1a; 二、C调试环境的编译要求1. 在编译时要带-g参数2. 多文件编译需要分步编译 三、VSCode的调试配置如下&#xff1a;1. 单文件调试设置4. 多文件调试设置 一、软件安装 1. 网址及下载的软件…

【JavaEE进阶】——第六节.第一个MyBatis程序

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;JavaEE进阶 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01; 文章目录 前…

计算机视觉(5)—— 图像分类

目录 五、图像分类 5.1 AlexNet 5.2 VGG 5.3 GoogLeNet、Inception 5.3.1 Inception V1 5.3.2 Inception V2 5.3.3 Inception V3 5.3.4 Inception V4 5.4 ResNet 残差网络 5.4.1 ResNet 5.4.2 ResNeXt 5.5 CNN设计准则 五、图像分类 5.1 AlexNet 5.2 VGG 5.3 Go…

【剑指 Offer】05,替换字符创中的空格;难度等级:简单。易错点:C++中 char 和 string 类型的转换

【剑指 Offer】05&#xff0c;替换字符创中的空格&#xff1b;难度等级&#xff1a;简单。 文章目录 一、题目二、题目背景三、我的解答四、易错点五、知识点&#xff1a;char 和 string 类型的转换 一、题目 二、题目背景 在网络编程中&#xff0c;如果 URL 参数中含有特殊字…

消息推送平台的实时数仓?!flink消费kafka消息入到hive

大家好&#xff0c;3y啊。好些天没更新了&#xff0c;并没有偷懒&#xff0c;只不过一直在安装环境&#xff0c;差点都想放弃了。 上一次比较大的更新是做了austin的预览地址&#xff0c;把企业微信的应用和机器人消息各种的消息类型和功能给完善了。上一篇文章也提到了&#…

windows安装Anaconda

Anacond是什么&#xff1f; 和Python有啥关系&#xff1f; 1、Anacond 是一个python的发行版&#xff0c;包括了python和很多常见的软件库, 和一个包管理器conda。常见的科学计算类的库都包含在里面了&#xff0c;使得安装比常规python安装要容易。 2、Anaconda是专注于数据分…

分布式系统概念和设计——时间和全局状态(分布式系统中的时间问题)

分布式系统概念和设计 时间和全局状态 全局物理时间的缺乏使我们很难查明分布式程序的执行时状态。 我们经常需要知道当进程B处在某种状态依赖进程是什么状态&#xff0c;但不能通过依靠物理时钟理解一个同一个时刻到底是什么情况。 维护分布数据一致性算法检查发送给服务器的…

数学(三) -- LC[1010][1015] 可被 K 整除的最小整数

1 可被 K 整除的最小整数 1.1 题目描述 题目链接&#xff1a;https://leetcode.cn/problems/smallest-integer-divisible-by-k/description/ 1.2 思路分析 模运算 如果让你计算 1234 ⋅ 6789 1234 \cdot 6789 1234⋅6789 的个位数&#xff0c;你会如何计算&#xff1f; 由于…

c高级day2

#include <stdio.h> #include <stdlib.h> #include <string.h>int arrMAX_1(void *p,int n,int m,int x,int y); int arrMAX_2(void *p,int n,int m,int x,int y); int main(int argc, const char *argv[]) {int n0,m0;printf("请输入行数i 列数j\n&quo…

Baumer工业相机堡盟工业相机如何进行多个工业相机IP地址配置

Baumer工业相机堡盟工业相机如何进行多个工业相机IP地址配置 Baumer工业相机Baumer工业相机进行多相机IP配置的技术背景Baumer工业相机如何进行多相机IP配置1.配置Baumer工业相机连接的PC端IP地址2.配置Baumer工业相机的IP地址 Baumer工业相机 Baumer工业相机堡盟相机是一种高…

R 中的探索性相关分析

动动发财的小手&#xff0c;点个赞吧&#xff01; 本文[1] 相关分析是探索两个或多个变量之间关系的最基本和最基础的方法之一。您可能已经在某个时候使用 R 执行过相关分析&#xff0c;它可能看起来像这样&#xff1a; cor_results <- cor.test(my_data$x, my_data$y, …

手机上调试pc端电脑上的项目

文章目录 前言1、window r 打开电脑命令窗口并输入cmd点击确定或者敲击回车键2、在cmd命令行面板上输入ipconfig获取本电脑的ip地址3、在手机浏览器中输入http://192.168.XX.XX:8080 即可 前言 手机上调试电脑运行的项目的前提条件是手机和电脑公用一个局域网&#xff08;也就…

APP 性能优化你掌握的怎么样?简单聊聊?

产品性能是每个技术团队比较关心的一件事&#xff0c;不管是产品上线前到上线后&#xff0c;都需要对产品进行性能监控和优化&#xff0c;如果产品在运行过程中出现了问题&#xff0c;是很影响用户的体验感受。 所以在一些大厂技术团队中&#xff0c;是非常看重个人性能优化的…

面向开发人员的 ChatGPT 提示词教程中文版

面向开发人员的 ChatGPT 提示词教程中文版 1. 指南1-1. 提示的指南1-2. 配置1-3. 提示语原则原则 1: 写出清晰而具体的指示技巧 1: 使用分隔符来清楚地表明输入的不同部分技巧 2: 要求提供结构化的输出技巧 3: 要求模型检查条件是否得到满足技巧 4: "少许样本"提示 原…

为你推荐一款最好用的免费截图工具-Snipaste,截图高清、智能模糊还支持滚动长截图!!!

写文章经常需要插入截图&#xff0c; 但是常常很难有顺手的截图工具&#xff0c; 常见的难题是&#xff1a; 很难滚动长屏截图&#xff0c; 截图中马赛克处理很麻烦&#xff0c; 输出的截图图像质量差。 经过大量的工具使用对比&#xff0c; 这里推荐一个最好用的截图工具。 Sn…

Fotran学习:chapter8函数

1.子程序(subrountine)的使用 把常常用于使用、具有特定功能的程序代码独立出来&#xff0c;封装程子程序&#xff0c;以后调用使用call即可。 program chapter4_exercise !主程序implicit nonecall sub1()call sub2()pauseend program chapter4_exercisesubroutine sub1() !子…

产品经理制,互联网公司发扬光大的

产品经理制&#xff0c;在互联网公司发扬光大 张小龙被称作&#xff1a;七星产品经理 其实&#xff0c;中小企业老板基本是首席产品经理 趣讲大白话&#xff1a;像带孩子一样做产品 【趣讲信息科技160期】 **************************** 产品经理制核心问题解决的是&#xff1a…

STM32F4_随机数发生器(RNG)

目录 1. 随机数发生器RNG是什么 2. RNG随机发生器框图 3. 运行RNG 4. RNG寄存器 4.1 RNG控制寄存器&#xff1a;RNG_CR 4.2 RNG状态寄存器&#xff1a;RNG_SR 4.3 RNG数据寄存器&#xff1a;RNG_DR 5. 库函数配置随机数发生器 6. 实验程序 6.1 main.c 6.2 RNG.c 6.…

植物奶站上风口

不知不觉间&#xff0c;植物奶无处不在。逛街&#xff0c;便利店里有燕麦奶、椰奶、豆奶&#xff0c;星巴克、肯德基有燕麦拿铁&#xff1b;打开小红书&#xff0c;有人做各种植物奶产品的测评结果&#xff0c;有人分享优质植物奶的自制方法…… 这场“风”并非空穴而来。 一…

软件工程开发文档写作教程(07)—招投标文件写作规范

本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl本文参考资料&#xff1a;电子工业出版社《软件文档写作教程》 马平&#xff0c;黄冬梅编著 招投标文件概述 国内的软件项目招投标文件的写作规则并不存在行业标准。许多大型企业的信息…