⭐️ C语言符号 ⭐️你真的懂取余\取模运算吗?!

简介: 本文主要讲解并真正理解取余\取模运算是怎样的!

前言


本文主要讲解并真正理解取余\取模运算是怎样的!

取整

首先取整有四种类型:

  1. 向0取整
  2. 向-∞取整
  3. 向+∞取整
  4. 四舍五入取整

向0取整

  • 示例:
int main() 
{ 
    //本质是向0取整 
    int i = -2.9; 
    int j = 2.9; 
    printf("%d\n", i); //结果是:-2 
    printf("%d\n", j); //结果是:2
    return 0; 
}

注:运行结果并不是像我们想的四舍五入数学取整,在C语言中本质是向0取整

20210822203000941.png

当然对于向0取整我们也可以使用trunc库函数 (需包含math.h头文件)

  • 示例:
#include <stdio.h> 
#include <math.h> //使用了trunc函数,需要添加该头文件 
int main() 
{ 
    //本质是向0取整,注意输出格式
    printf("%.1f\n", trunc(-2.9)); //-2
    printf("%.1f\n", trunc(-2.1)); //-2 
    printf("%.1f\n", trunc(2.9)); //2 
    printf("%.1f\n", trunc(2.1)); //2
    return 0; 
}

向-∞取整

这里我们需要floor库函数(需包含math.h头文件)

  • 示例:
#include <stdio.h> 
#include <math.h> //因为使用了floor函数,需要添加该头文件 
int main() 
{ 
    //本质是向-∞取整,注意输出格式
    printf("%.1f\n", floor(-2.9)); //-3 
    printf("%.1f\n", floor(-2.1)); //-3 
    printf("%.1f\n", floor(2.9)); //2 
    printf("%.1f\n", floor(2.1)); //2
    return 0; 
}


2021082220401449.png

向+∞取整

这里我们需要ceil库函数(同样是math.h头文件)

  • 示例:
#include <stdio.h> 
#include <math.h>
int main() 
{ 
    //本质是向+∞取整,注意输出格式
    printf("%.1f\n", ceil(-2.1)); //-2 
    printf("%.1f\n", ceil(2.9));  //3 
    printf("%.1f\n", ceil(2.1));  //3 
    return 0; 
}


2021082220454423.png

四舍五入取整

这里我们需要round库函数(math.h头文件)

  • 示例:
#include <stdio.h> 
#include <math.h>
int main() 
{ 
    //本质是四舍五入,同样注意输出格式
    printf("%.1f\n", round(2.1)); 
    printf("%.1f\n", round(2.9)); 
    printf("%.1f\n", round(-2.1)); 
    printf("%.1f\n", round(-2.9));
    return 0; 
}

汇总

#include <stdio.h> 
#include <math.h> 
int main() 
{ 
    const char * format = "%.1f \t%.1f \t%.1f \t%.1f \t%.1f\n";                       printf("value\tround\tfloor\tceil\ttrunc\n"); 
    printf("-----\t-----\t-----\t----\t-----\n"); 
    printf(format, 2.3, round(2.3), floor(2.3), ceil(2.3), trunc(2.3)); 
    printf(format, 3.8, round(3.8), floor(3.8), ceil(3.8), trunc(3.8)); 
    printf(format, 5.5, round(5.5), floor(5.5), ceil(5.5), trunc(5.5)); 
    printf(format, -2.3, round(-2.3), floor(-2.3), ceil(-2.3), trunc(-2.3)); 
    printf(format, -3.8, round(-3.8), floor(-3.8), ceil(-3.8), trunc(-3.8)); 
    printf(format, -5.5, round(-5.5), floor(-5.5), ceil(-5.5), trunc(-5.5));
    return 0; 
}
  • 输出结果:
  • 20210822210048490.png

结论:浮点数(整数/整数),是有很多的取整方式的

取模\余


  • 定义:

如果ad是两个自然数,d非零,可以证明存在两个唯一的整数 q r

满足 a = q*d + r 0 ≤ r < d。其中,q 被称为商,r 被称为余数

对于正数取模

  • 示例:
int main() 
{ 
    int a = 10; 
    int d = 3; 
    printf("%d\n", a%d); //结果是1 (c,python结果相同)
    //因为:a=10,d=3,q=3,r=1 0<=r<d(3) 
    //所以:a = q*d+r -> 10=3*3+1 
    return 0; 
}

对于负数取模

  • 示例:
int main() 
{ 
    int a = -10; 
    int d = 3;
    printf("%d\n", a/d); //C语言中是-3,python是-4
    printf("%d\n", a%d);//C语言中是-1,python是2
    return 0; 
}


为什么就有差异了呢?

解释:

C : - 10 = ( - 3 ) * 3 + ( - 1 )

Python : - 10 = ( - 4 ) * 3 + 2

从上看出:

具体余数r的大小,本质是取决于商q的,而取商取决于取证规则

由此对于负数“取模”结果的不同,我们分别称之为正余数和负余数

取余和取模的理解


取余:尽可能让商,进行向0取整

取模:尽可能让商,向-方向取整

从而C中%,本质其实是取余;Python中%,本质其实是取模

对任何一个大于0的数,对其进行0向取整和-取整,取整方向是一致的,故取模等价于取余

对任何一个小于0的数,对其进行0向取整和-取整,取整方向是相反的,故取模不等价于取余

  • 结论:

两个同符号数据参与取余,取模等价于取余,不同语言余数相等

两个不符号数据参与取余,取模不等价于取余,余数大小需考虑语言取整规则


相关文章
|
6月前
|
C语言
C语言的详解操作符(2)之取余操作符
C语言的详解操作符(2)之取余操作符
|
6月前
|
C语言
c语言编程练习题:7-16 计算符号函数的值
请编写程序计算该函数对任一输入整数的值。
118 0
|
2月前
|
存储 C语言 数据格式
【C语言基础考研向】03混合运算和printf讲解
本文分为两部分。第一部分介绍了C语言中的混合运算与类型强制转换的重要性,通过实例展示了当整型数进行除法运算且结果为小数时,必须使用类型转换才能正确存储浮点数结果。第二部分详细讲解了`printf`函数的功能与使用方法,包括格式化输出不同类型数据的基本语法,并通过具体示例演示了如何利用字段宽度和对齐方式来控制输出格式,帮助读者更好地理解和掌握输出格式的控制技巧。
46 10
|
5月前
|
C语言
C 语言的运算及流程控制分享
C 语言的运算及流程控制
|
5月前
|
架构师 NoSQL C语言
[深入浅出C语言]理解取整、取余和取模
推荐一个零声教育C/C++后台开发的免费公开课程,个人觉得老师讲得不错,分享给大家:C/C++后台开发高级架构师,内容包括Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,[立即学习]
99 2
|
5月前
|
C语言
C语言中的赋值运算、比较运算和逻辑运算详解
C语言中的赋值运算、比较运算和逻辑运算详解
|
6月前
|
C语言 C++ 索引
C语言符号——操作符详解
C语言符号——操作符详解
C语言符号——操作符详解
|
6月前
|
C语言 C++
C语言:指针运算笔试题解析(包括令人费解的指针题目)
C语言:指针运算笔试题解析(包括令人费解的指针题目)
|
6月前
|
算法 C语言
C语言双目算数运算
C语言双目算数运算
117 0
C语言双目算数运算
|
6月前
|
存储 机器学习/深度学习 自然语言处理
【进阶C语言】编译与链接、预处理符号详解
【进阶C语言】编译与链接、预处理符号详解
65 0