C/C++除法及取模
来源:互联网 发布:移动端js框架有哪些 编辑:程序博客网 时间:2024/04/28 04:08
1.向上取整:向+∞方向取最接近精确值的整数。在这种取整方式下,7/4=2,7/(-4)=-1,6/3=2,6/(-3)=-2
2.向下取整:向-∞方向取最接近精确值的整数。在这种取整方式下,7/4=1,7/(-4)=-2,6/3=2,6/(-3)=-2
3.向零取整:向0方向取最接近精确值的整数,换言之就是舍去小数部分,因此又称截断取整。在这种取整方式下,7/4=1,7/(-4)=-1,6/3=2,6/(-3)=-2
通过观察可以发现,无论是向上取整还是向下取整,(-a)/b==-(a/b)都不一定成立。这给程序设计者带来了极大的麻烦。而对于向零取整,(-a)/b==-(a/b)是成立的,以此,C/C++采用这种取整方式。
二、负数取模
回想小学的公式:被除数÷除数=商……余数。
由此可知,余数=被除数-商×除数 (*)
对C/C++而言,(*)式依然成立。并且,该式是解决负数取模问题的关键。
例一:7%(-4)=?
解:由C/C++向零取整的整除方式可知,7/(-4)=-1;由(*)式知,余数=7-(-4)*(-1)=3.所以,7%(-4)=3
例二:(-7)%4=?
解:由C/C++向零取整的整除方式可知,(-7)/4=-1;由(*)式知,余数=(-7)-4*(-1)=-3.所以,(-7)%4=-3
例三:(-7)%(-4)=?
解:由C/C++向零取整的整除方式可知,(-7)/(-4)=1;由(*)式知,余数=(-7)-(-4)*1=-3.所以,(-7)%(-4)=-3
三、相关知识的拓展
1.对于有符号整数与无符号整数间的除法,C/C++会将有符号整数转换为无符号整数,需要特别注意的是,符号位并没有丢失,而是变成了数据位参与运算。这就是(-7)/(unsigned)4不等于-1,而等于1073741822的原因。
2.编译器对除法的优化
①在“无优化”条件下,编译器会在不影响正常调试的前提下,对除法进行简单的优化。
A.“常量/常量”型除法:编译器会直接计算出结果。
B.“变量/变量”型除法:无优化。
C.“变量/常量”型除法:若常量≠2^n,无优化;否则,除法将被转换为右移运算。由于由右移运算实现的整除实质上是向下取整,所以编译器会通过一些附加的指令在不产生分支结构的情况下将向下取整转换为向零取整。
以【变量/2^3】为例,反汇编代码如下:
mov eax,被除数
cdq ;若eax<0,则edx=0xFFFFFFFF;否则edx=0
and edx,7 ;若eax<0,则edx=7;否则edx=0
add eax,edx ;若eax<0,【(eax+7)/(2^3)】向下取整的值 与 【eax/(2^3)】向零取整的值相等,从而实现向零取整
sar eax,3 ;右移,完成除法
②在“O2优化”条件下,“变量/常量”型除法中,常量若≠2^n,也可以优化。此时,除法将被转换为乘法与右移的结合形式。例如,a/b=a*(1/b)=a*((2^n)/b)*(1/(2^n)),其中,((2^n)/b为MagicNumber,由编译器在编译过程中算出。这样a/b就变成了(a*MagicNumber)>>n,n的值由编译器选取。需要注意的是,本公式只是除法优化中的一个典型代表,编译器会根据除数对公式进行调整,但基本形式与原理是类似的。
- C/C++除法及取模
- C/C++除法实现方式及负数取模详解
- C/C++除法实现方式及负数取模详解
- C/C++除法实现方式及负数取模详解
- C/C++除法实现方式及负数取模详解
- C/C++除法实现方式及负数取模详解
- C/C++除法实现方式及负数取模详解
- C/C++除法实现方式及负数取模详解(From Baidu贴吧)
- 关于C的除法 取余
- C语言正整数除法向上取整
- C语言除法向上、向下取整
- C语言除法向上、向下取整
- 模2除法(C/C++)
- Python中负数的除法和取模运算(和C比较)
- 负数的除法和取模运算(Python 2.7和C的比较)
- C语言中除法的向上取整
- C语言处理除法和取余操作过程
- 关于C中除法向上取整的证明
- 用fork( )和execvp( )编写自己的shell
- Master Note: Troubleshooting Database Transaction Recovery (Doc ID 1494886.1)
- 身体又垮了
- 解决 与MySQL 连接失败 Communications link failure Connection timed out
- centos 和 ubuntu 安装 gitolite
- C/C++除法及取模
- Lua的面向对象
- 模式分类对于最大似然参数估计与贝叶斯参数估计的一些理解
- 配置Ubuntu Server高速apt-get源
- hdu 4407 Sum(容斥)
- hdu 1796 How many integers can you find[经典容斥原理]
- 一个轻量级Actor并发框架的c++实现, libgsc(Game Server Communication Library)(一)
- Codeforces--192.div2.D Biridian Forest bfs
- Oracle Workflow Builder 下载地址