原帖:http://blog.csdn.net/sonydvd123/article/details/8245057

一、下面的题目你能全做对吗?
1.7/4=?
2.7/(-4)=?
3.7%4=?
4.7%(-4)=?
5.(-7)/4=?
6.(-7)%4=?
7.(-7)/(unsigned)4=?
答案:
1
-1
3
3
-1
-3
1073741822
如过你全部答对,你可以无视后面的内容……

二、除法的取整分类
除法的取整分为三类:向上取整、向下取整、向零取整。
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的值由编译器选取。需要注意的是,本公式只是除法优化中的一个典型代表,编译器会根据除数对公式进行调整,但基本形式与原理是类似的。

转载地址:http://tieba.baidu.com/p/1881961036

——————————————————————————————————————————

以下摘录自C++  Primer(P130)

操作符%称为“求余”或“求模”操作符,该操作符的操作数只能为整型。

如果两个操作数为正,结果也为正;如果两个操作数都为负数,结果也为负数;如果一个操作数为正数,一个操作数为负数,求模结果的符号取决于机器。

当操作数中有一个为负,一个为正是,求模操作结果值的符号可依据分子(被除数)或分母(除数)的符号而定。如果求模的结果随分子的符号,则除出来的值向零一侧取整;如果求模与分母的符号匹配,则除出来的值向负无穷大一侧取整。

(VC貌似是根据左操作数来确定求模操作的符号)

【转】C/C++除法实现方式及负数取模详解的更多相关文章

  1. C/C++除法实现方式及负数取模详解

    一.下面的题目你能全做对吗? 1.7/4=? 2.7/(-4)=? 3.7%4=? 4.7%(-4)=? 5.(-7)/4=? 6.(-7)%4=? 7.(-7)/(unsigned)4=? 答案: ...

  2. C++负数取模

    预习: r=余数 a=被除数 b=除数 c=商 a/b=c........r r=a-(a/b)*b 一.下面的题目你能全做对吗?1.7/4=?2.7/(-4)=?3.7%4=?4.7%(-4)=?5 ...

  3. CodeForces 450B (矩阵快速幂模板题+负数取模)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=51919 题目大意:斐波那契数列推导.给定前f1,f2,推出指定第N ...

  4. JAVA高级架构师基础功:Spring中AOP的两种代理方式:动态代理和CGLIB详解

    在spring框架中使用了两种代理方式: 1.JDK自带的动态代理. 2.Spring框架自己提供的CGLIB的方式. 这两种也是Spring框架核心AOP的基础. 在详细讲解上述提到的动态代理和CG ...

  5. python中的负数取模问题(一个大坑)

    先来看一段代码 这是什么情况?为什么会出现这种结果.我们再来看看其它语言的执行结果 我们用golang.js.c分别算了一下,结果得到的结果都是一致的,但是python为啥不一样呢? 其实之所以这么做 ...

  6. SEO方式之HTTPS 访问优化详解

    SEO到底要不要做HTTPS?HTTPS对SEO的重要性 正方观点 1.HTTPS具有更好的加密性能,避免用户信息泄露: 2.HTTPS复杂的传输方式,降低网站被劫持的风险: 3.搜索引擎已经全面支持 ...

  7. Spring中的注入方式 和使用的注解 详解

    注解:http://www.cnblogs.com/liangxiaofeng/p/6390868.html 注入方式:http://www.cnblogs.com/java-class/p/4727 ...

  8. ExtJS布局方式(layout)图文详解

    Auto默认布局 不给下级组件指定大小和位置 Absolute绝对布局 可使用坐标(x.y)进行布局 Accordion手风琴布局 实现Accordion效果的布局,也可叫可折叠布局.也就是说使用该布 ...

  9. Form_Form页面跳转的四种方式(open_form, call_form, new_form, fnd_function)详解(汇总)

    2014-06-29 Created By BaoXinjian

随机推荐

  1. poj 3522 Slim Span (最小生成树kruskal)

    http://poj.org/problem?id=3522 Slim Span Time Limit: 5000MS   Memory Limit: 65536K Total Submissions ...

  2. Matlab求极限

    matlab求极限(可用来验证度量函数或者隶属度函数)可用来验证是否收敛,取值范围等等. 一.问题来源 搜集聚类资料时,又看到了隶属度函数,没错,就是下面这个,期间作者提到m趋于2是,结果趋于1,我想 ...

  3. centos64位安装32位C/c++库

    yum install glibc.i686 glibc-devel.i686 yum install libstdc++.i686yum install libstdc++-devel.i686yu ...

  4. mysql数据库备份执行计划

    为什么需要数据备份?如果数据库因为人为或其他不可控的因素导致数据库数据丢失或损坏,导致的后果将会非常严重. 为什么需要执行计划?备份操作如果每天人工管理的话,将会非常麻烦,需要借助工具来制定执行计划, ...

  5. php的redis 操作类,适用于单台或多台、多组redis服务器操作

    redis 操作类,包括单台或多台.多组redis服务器操作,适用于业务复杂.高性能要求的 php web 应用. redis.php: <?php /* redis 操作类,适用于单台或多台. ...

  6. CodeForces 279B Books

    http://codeforces.com/problemset/problem/279/B 题意 :Valera 有很多的空闲时间,所以他决定看书,给出n本书,编号1到n,和看每本书需要的时间,他看 ...

  7. jvisualvm 使用

    和jconsole侧重于内存分析和检测不同,jvisualvm在线程分析方面更强大一些,下面简单介绍下使用: 1. 在要监控的java应用配置文件中,本例是apache-jmeter/bin/jmet ...

  8. adobe 蛋疼的套装, 想安装一个Flash Professional CS6,标准版还没有...

    产品比较 查看内容 查看各 Creative Suite 6 版本的组件. Design Standard Design & Web Premium Production Premium Ma ...

  9. nginx的负载均衡和反响代理配置

    4.        负载均衡配置 nginx 的 upstream默认是以轮询的方式实现负载均衡,这种方式中,每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除. 另外 ...

  10. Android 响应webview中图片的点击事件

    最近碰到个新需求需要点击webview中的图片进行放大显示. 整理了下思路,想到了下面的一个可行的方案. 方案思路, 1.在点击图片的时候调用本地的java方法并给出响应的图片地址 2.本地获得图片地 ...