对于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. 竞赛题解 - Broken Tree(CF-758E)

    Broken Tree(CF-758E) - 竞赛题解 贪心复习~(好像暴露了什么算法--) 标签:贪心 / DFS / Codeforces 『题意』 给出一棵以1为根的树,每条边有两个值:p-强度 ...

  2. IO,File对象-构造函数和常用方法

    import java.io.File; import java.text.DateFormat; import java.util.Date; public class FileDemo { pub ...

  3. 关于Vue的组件的通用性问题

    在项目中,经常会有需求让我们把很多通用性的功能写成一个模板,然后根据不同的应用场景传入不同的参数来完成某种功能 但是在很多时候,其实并不是一个模板就能完成所有的功能的 这就需要分类写组件了,但是需求方 ...

  4. 【Spark】Spark2.x版的新特性

    一.API 1. 出现新的上下文接口:SparkSession,统一了SQLContext和HiveContext,并且为SparkSession开发了新的流式调用的configuration API ...

  5. 利用GoAccess分析Nginx访问日志

    原文链接:https://blog.csdn.net/yown/article/details/56027112 需求:及时得到线上用户访问日志分析统计结果,以便给开发.测试.运维.运营人员提供决策! ...

  6. Appointment Helper

    using System; using Microsoft.Xrm.Sdk; using Microsoft.Crm.Sdk.Messages; using Microsoft.Xrm.Sdk.Que ...

  7. Java客户端访问HBase集群解决方案(优化)

    测试环境:Idea+Windows10 准备工作: <1>.打开本地 C:\Windows\System32\drivers\etc(系统默认)下名为hosts的系统文件,如果提示当前用户 ...

  8. Vue directive自定义指令+canvas实现H5图片压缩上传-Base64格式

    前言 最近优化项目-手机拍照图片太大,回显速度比较慢,使用了vue的自定义指令实现H5压缩上传base64格式的图片 canvas自定义指令 Vue.directive("canvas&qu ...

  9. emWin 学习笔记 —— 用VS2017打开emWin仿真包

    使用VS2017打开emWin仿真包 解压以后的仿真包目录 SimulationTrial.sln 就是工程文件,直接使用VS2017打开即可 打开以后就是这样子,不要急着编译.直接编译会出错 在项目 ...

  10. 常用 Maven 配置

    打包为带依赖的 JAR <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEnc ...