C中的除法,商和余数的大小、符号如何确定
对于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中的除法,商和余数的大小、符号如何确定的更多相关文章
- VB.NET中的除法运算符 与 C#中的除法运算符
		VB.NET中的除法运算符有两个:/(浮点除法).\(整数除法) C#中的除法运算符只有一个:/(除法) VB.NET中的除法运算符与C#中的除法运算符存在很大的差异,使用时注意区分. 关于VB.NE ... 
- SQL中查看数据库各表的大小
		SQL中查看数据库各表的大小 编写人:CC阿爸 2014-6-17 在日常SQL数据库的操作中,如何快速的查询数据库中各表中数据的大小. 以下有两种方法供参考: 第一种: create table # ... 
- [百度]数组A中任意两个相邻元素大小相差1,在其中查找某个数
		一.问题来源及描述 今天看了July的微博,发现了七月问题,有这个题,挺有意思的. 数组A中任意两个相邻元素大小相差1,现给定这样的数组A和目标整数t,找出t在数组A中的位置.如数组:[1,2,3,4 ... 
- 分别取商和余数:divmod(a, b)
		使用函数:divmod(a, b)可以实现分别取商和余数的操作: >>> divmod(123,3) (41, 0) >>> divmod(200,6) (33, ... 
- SQL点滴23—T-SQL中的除法
		原文:SQL点滴23-T-SQL中的除法 在T-SQL中没有除法运算,但是在T-SQL中可以实现类似除法的操作Divide.一般除法操作的结果一个列来自于被除关系表,剩下的来自除关系表.这里举一个例子 ... 
- java统计指定目录中文件的个数和总的大小
		转: 统计指定目录中文件的个数和总的大小 package file; import java.io.File; import java.util.ArrayList; public class Fil ... 
- 【python】python2.x中的除法
		在生信分析中有许多时候我们需要用到除法,在经历无数次break out 之后我终于发现原来python 2.x中只有整除,而没有浮点除法,这就是没有基础的弊病. 那么如何在python 2.x中运用除 ... 
- python技巧 python2中的除法结果为0
		在python2中执行除法操作如果结果小于1就会返回0 如下面的例子: >>>81/82 0 如果你需要返回"正确的结果 ",有两种方法: 在脚本中引入from ... 
- Altium中Logo的导入方法及大小调整
		Altium中Logo的导入方法及大小调整 LOGO识别性是企业标志的重要功能之一,特点鲜明.容易辨认,很多客户需要在PCB设计阶段导入LOGO标示归属特性.如果LOGO是CAD图纸,可以直接按照 ... 
随机推荐
- chromium之lazy_instance
			先看看介绍 // The LazyInstance<Type, Traits> class manages a single instance of Type, // which will ... 
- javascript 时间倒计时效果
			<div id="divdown1"></div> <script language="javascript" type=&quo ... 
- vue 引入 mint-ui 简单使用
			一 npm 方式 1,安装依赖 (已有项目) 如果想简单体验:基于vue-cli /* npm install vue -g npm install vue-cli -g // -g 是否全局 ... 
- C#获取本地磁盘信息
			直接上干货简单易懂 //磁盘监控(远程/本地) //需要引用System.Management.dll public class RemoteMonitoring { private static s ... 
- 分析nginx 日志常用命令
			一.概念 并发连接数 客户端向服务器发起请求,并建立了TCP连接.每秒钟服务器链接的总TCP数量,就是并发连接数.请求数 请求数指的是客户端在建立完连接后,向http服务发出GET/POS ... 
- 使用 win10 的库来组织自己的同类文件
			库相当于虚拟目录,可以把不同的文件夹包含起来. 找起东西来不用东奔西跑了... 
- usb之鼠标作为按键输入
			1. 首先搞清楚,鼠标点左键.右键等能得到什么数据,然后分析这些数据上报事件即可. 第一个基本点:usb_alloc_urb函数,创建一个struct urb结构体,只能使用这个函数来创建,它是urb ... 
- elasticsearch按范围聚合
			范围聚合适用于对数据按照指定范围进行分类聚合的应用场景,from和to表示范围起始值的半开半闭区间(包含from值不包含to值),key表示别名 如 {:key=>"2h", ... 
- Hangfire初探
			Hangfire 是什么? Hangfire 是一个定时任务的管理后台,它拥有定时任务功能和及其相关的管理后台界面.Hangfire 原生使用 .NET 开发的,同时支持 .NET 和 .NET Co ... 
- 【commons】字符串工具类——commons-lang3之StringUtils
			类似工具见Hutool-StrUtil 一.起步 引入maven依赖 <!-- https://mvnrepository.com/artifact/org.apache.commons/com ... 
