对于C中的除法,商和余数的大小、符号是如何确定的呢?在C89中,只规定了如果两个数为正整数,那么余数的符号为正,并且商的值是接近真实值的最大整数。比如5 / 2,那么商就是2,余数就是1。但是,C89里面对于被除数和除数里面,有负整数时,商的大小以及余数的符号没有做出明确的规定,而只是说这依赖于具体实现。在Windows下(是Intel汇编指令),看如下如下例子:

int main() {
int a = -;
int b = a / ;
}

接下来看汇编码:

; 1    : int main() {

    push    ebp
mov ebp, esp
sub esp, ; 2 : int a = -5; mov DWORD PTR _a$[ebp], - ; fffffffbH ; 3 : int b = a / 3; mov eax, DWORD PTR _a$[ebp]
cdq
mov ecx,
idiv ecx ;idiv执行有符号的除法,并且余数的符号和被除数一样
mov DWORD PTR _b$[ebp], eax ; 4 : }

汇编码中,最重要的就是idiv指令,这个指令运行后的结果是余数的符号会保持和被除数一样,同时,对于除法来说,余数的绝对值要小于除数的绝对值,这样,我们就可以确定商、余数的大小以及符号。对于上面的例子-5 / 3来说,商就是-1,余数就是-2。

有时,由于除法可以转换成加减法以及算数右移来执行,汇编码不会用到idiv指令(这可以看成是一种优化),但是结果不会有影响,比如看下面的-5 / 2的汇编指令,就没有用到idiv,但是结论和上面一样,商是-2,余数是-1:

; 1    : int main() {

    push    ebp
mov ebp, esp
sub esp, ; 2 : int a = -5; mov DWORD PTR _a$[ebp], - ; fffffffbH ; 3 : int b = a / 2; mov eax, DWORD PTR _a$[ebp]
cdq
sub eax, edx
sar eax, ;算数右移操作
mov DWORD PTR _b$[ebp], eax ; 4 :
; 5 : }

上面的结论在Linux下(AT&T风格的汇编)同样成立,虽然汇编码和Intel汇编不一样。

另外,C89中规定,对于%取余运算符,只适用于整型

C中的除法,商和余数的大小、符号如何确定的更多相关文章

  1. VB.NET中的除法运算符 与 C#中的除法运算符

    VB.NET中的除法运算符有两个:/(浮点除法).\(整数除法) C#中的除法运算符只有一个:/(除法) VB.NET中的除法运算符与C#中的除法运算符存在很大的差异,使用时注意区分. 关于VB.NE ...

  2. SQL中查看数据库各表的大小

    SQL中查看数据库各表的大小 编写人:CC阿爸 2014-6-17 在日常SQL数据库的操作中,如何快速的查询数据库中各表中数据的大小. 以下有两种方法供参考: 第一种: create table # ...

  3. [百度]数组A中任意两个相邻元素大小相差1,在其中查找某个数

    一.问题来源及描述 今天看了July的微博,发现了七月问题,有这个题,挺有意思的. 数组A中任意两个相邻元素大小相差1,现给定这样的数组A和目标整数t,找出t在数组A中的位置.如数组:[1,2,3,4 ...

  4. 分别取商和余数:divmod(a, b)

    使用函数:divmod(a, b)可以实现分别取商和余数的操作: >>> divmod(123,3) (41, 0) >>> divmod(200,6) (33, ...

  5. SQL点滴23—T-SQL中的除法

    原文:SQL点滴23-T-SQL中的除法 在T-SQL中没有除法运算,但是在T-SQL中可以实现类似除法的操作Divide.一般除法操作的结果一个列来自于被除关系表,剩下的来自除关系表.这里举一个例子 ...

  6. java统计指定目录中文件的个数和总的大小

    转: 统计指定目录中文件的个数和总的大小 package file; import java.io.File; import java.util.ArrayList; public class Fil ...

  7. 【python】python2.x中的除法

    在生信分析中有许多时候我们需要用到除法,在经历无数次break out 之后我终于发现原来python 2.x中只有整除,而没有浮点除法,这就是没有基础的弊病. 那么如何在python 2.x中运用除 ...

  8. python技巧 python2中的除法结果为0

    在python2中执行除法操作如果结果小于1就会返回0 如下面的例子: >>>81/82 0 如果你需要返回"正确的结果 ",有两种方法: 在脚本中引入from  ...

  9. Altium中Logo的导入方法及大小调整

    Altium中Logo的导入方法及大小调整   LOGO识别性是企业标志的重要功能之一,特点鲜明.容易辨认,很多客户需要在PCB设计阶段导入LOGO标示归属特性.如果LOGO是CAD图纸,可以直接按照 ...

随机推荐

  1. .Net 上传文件到ftp服务器和下载文件

    突然发现又很久没有写博客了,想起哎呦,还是写一篇博客记录一下吧,虽然自己还是那个渣渣猿. 最近在做上传文件的功能,上传到ftp文件服务器有利于管理上传文件. 前面的博客有写到layui如何上传文件,然 ...

  2. python打印99乘法表

    代码如下: print(XXX,end="\t") #表示打印不换行 附带python部分转义字符:

  3. 坑爹的jquery ui datepicker

    1.坑爹的jquery ui datepicker 竟然不支持选取时分秒,害的我Format半天 期间尝试了bootstrap的ditepicker,但是不起作用,发现被jquery ui 覆盖了, ...

  4. vue2.0 移动端,下拉刷新,上拉加载更多插件,修改版

    在[实现丰盛]的插件基础修改[vue2.0 移动端,下拉刷新,上拉加载更多 插件], 1.修改加载到尾页面,返回顶部刷新数据,无法继续加重下一页 2.修改加载完成文字提示 原文链接:http://ww ...

  5. idea配置SpringBoot热部署之自动Build

    一.pom.xml文件导入所需依赖文件 SpringBoot热部署插件 <dependency> <groupId>org.springframework.boot</g ...

  6. Python学习手册之捕获组和特殊匹配字符串

    在上一篇文章中,我们介绍了 Python 的字符类和对元字符进行了深入讲解,现在我们介绍 Python 的捕获组和特殊匹配字符串.查看上一篇文章请点击:https://www.cnblogs.com/ ...

  7. Java学习笔记二十五:Java面向对象的三大特性之多态

    Java面向对象的三大特性之多态 一:什么是多态: 多态是同一个行为具有多个不同表现形式或形态的能力. 多态就是同一个接口,使用不同的实例而执行不同操作. 多态性是对象多种表现形式的体现. 现实中,比 ...

  8. 洛谷P4526 【模板】自适应辛普森法2(simpson积分)

    题目描述 计算积分 保留至小数点后5位.若积分发散,请输出"orz". 输入输出格式 输入格式: 一行,包含一个实数,为a的值 输出格式: 一行,积分值或orz 输入输出样例 输入 ...

  9. Lucene第一讲——概述与入门

    一.概述 1.什么是Lucene? Lucene是apache下的一个开源的全文检索引擎工具包. 它为软件开发人员提供一个简单易用的工具包(类库),以方便的在目标系统中实现全文检索的功能. 2.能干什 ...

  10. Git中分支merge和rebase的适用场景及区别

    Git merge是用来合并两个分支的. git merge b      # 将b分支合并到当前分支 同样 git rebase b,也是把 b分支合并到当前分支 原理 如下: 假设你现在基于远程分 ...