假定我们让 a 除以 b,商为 q,余数为 r: q = a / b;

r = a % b;

这里,不妨假定 b 大于 0。

我们希望 a、b、q、r 之间维持怎样的关系呢?

1.最重的一点,我们希望 q * b + r == a,因为这是定义余数的关系。

2.如果我们改变 a 的正负号,我们希望这会改变 q 的符号,但这不会改变 q  的绝对值。

3.当 b>0 时,我们希望保证 r >= 0 且 r < b。例如,如果余数用于哈希表的索引,确保 它是一个有效的索引值很重 。

这三条性质是我们认为整数除法和余数操作所应该具备的。很不幸的是,它们不可能同时成立。

考虑一个简单的例子:3/2,商为 1,余数也为 1。此时,第 1 条性质得到了满足。(-3)/2 的值应该是多少呢?如果 满足第 2 条性质,答案应该是-1,但如果是这样,余数就必定是-1,这样第 3 条性质就无法满足了。如果我们首先满足第 3 条性质,即余数是 1,这种情况下根据第 1 条性质则商是-2,那么第 2 条性质又无法满足了。

因此,C 语言或者其他语言在实现整数除法截断运算时,必须放弃上述三条原则中的至 少一条。大多数程序设计语言选择了放弃第 3 条,而改为 求余数与被除数的正负号相同。 这样,性质 1 和性质 2 就可以得到满足。大多数 C 编译器在实践中也都是这样做的。

然而,C 语言的定义只保证了性质 1,以及当 a>=0 且 b>0 时,保证|r| < |b|以及 r>=0。 后面部分的保证与性质 2 或者性质 3 比较起来,限制性 弱得多。

C 语言的定义虽然有时候会带来不需 的灵活性,但大多数时候,只要编程者清楚地知道要做什么、该做什么,这个定义对让整数除法运算满足其需要来说还是够用了的。例如,

假定我们有一个数 n,它代表标识符中的字符经过某种函数运算后的结果,我们希望通过除 法运算得到哈希表的条目 h,满足 0<=h

h=n%HASHSIZE:

然而,如果 n 有可能为负数,而此时 h 也有可能为负,那么这样做就不一定总是合适 的了。不过,我们己知 h>-HASHSIZE,因此我们可以这样写:

h = n % HASHSIZE;

if(n < 0)

h += HASHSIZE;

更好的做法是,程序在设计时就应该避免 n 的值为负这样的情形,并且声明 n 为无符号数。

测试代码:

#include

main()

{

int a=-, b=;

int q,r;

q = a / b;

r = a % b;

printf("q=%d, r=%d\n", q, r);

}

Swift 求余运算

求余运算 求余运算(a % b)是计算b的多少倍刚刚好可以容入a,返回多出来的那部分(余数). 注意:求余运算(%)在其他语言也叫取模运算.然而严格说来,我们看该运算符对负数的操作结果,"求 ...

java 整除&lpar;&sol;&rpar; 求余&lpar;&percnt;&rpar; 运算

1. java 整除(/)  求余(%)  运算 1.求余    System.out.println(11%2);     //顾名思义就是11除2的余数-->1    System.out. ...

PHP&colon;第一章——按位运算和求余运算(判断奇偶数)

051-PHP求余运算

和求余运算巧妙结合的jns指令

.text:004A78B1  and eax, 80000001h.text:004A78B6  jns short loc_4A78BD.text:004A78B8 dec eax.text:00 ...

Sicily1020-大数求余算法及优化

Github最终优化代码: https://github.com/laiy/Datastructure-Algorithm/blob/master/sicily/1020.c 题目如下: 1020. ...

Verilog求余

在实现三角函数时,考虑到函数的周期性,综量(自变量)需对周期做求余运算. 假设函数周期为T = 2^N,那么求余运算就是直接取该数的低N位,即: 以M位正数为例(符号位为0),reg [M-1:0] ...

java学习--高效的除模取余运算&lpar;n-1&rpar;&amp&semi;hash

没有测试过使用取余运算符和位运算符都做同一件事时的时间效率! 取余运算符% 如3除以2取余数 a = a%; 结果为1 上面是传统的方式进行求余运算. 需要先将10进制转成2进制到内存中进行计算,然后 ...

C语言 负数取余的原理

负数求余数运算是一个数学问题: 任何一个整数n都可以表示成 n=k*q+r 其中0<=|r|

随机推荐

如何一步一步用DDD设计一个电商网站(四)—— 把商品卖给用户

阅读目录 前言 怎么卖 领域服务的使用 回到现实 结语 一.前言 上篇中我们讲述了“把商品卖给用户”中的商品和用户的初步设计.现在把剩余的“卖”这个动作给做了.这里提醒一下,正常情况下,我们的每一步业 ...

win10 64位专业版系统中显示32位dcom组件配置的方法

word.excel是32位的组件,当用户64位系统在运行窗口中输入dcomcnfg命令时,在打开的组件服务管理窗口,是找不到Microsoft Excel.word程序的.另外,Windows 环境 ...

新浪微博顶部新评论提示层效果——position:fixed

c语言负数除法运算过程,C语言负数的除法和求余运算相关推荐

  1. c语言乘法运算 相对于,C语言中,求余运算与乘除法运算,哪个的优先级高

    C语言中,求余运算与乘除法运算,优先级一样高. C语言是一门面向过程的.抽象化的通用程序设计语言,广泛应用于底层开发.C语言能以简易的方式编译.处理低级存储器.C语言是仅产生少量的机器语言以及不需要任 ...

  2. C语言简单计算器考虑优先级,利用你现有的c语言知识 设计开发一个简易计算器,可进行加、减、乘、除、求余运算。...

    满意答案 nxy_159 推荐于 2017.11.21 采纳率:52%    等级:9 已帮助:3561人 #include float numA = 0; float numB = 0; float ...

  3. java大整数的加减乘除_关于大整数的加减乘除求余运算 java

    自己用java 实现了大字符串整数的加减乘除和求余运算, 加减法的算法是模拟手工笔算的计算过程, 除法就是从最高位不停的减操作, 乘法的算法 :遍历一个数的各个位数以及他所在位置,另一个数根据这个数的 ...

  4. 求余运算转换为位运算

    因为求余运算要用到除法,除法是比较费时的.因此高性能的程序需要对求余进行转换. 如果被求余数是2的整数次幂,可以用位运算来进行转换,从而得到比较高的效率. 例如求 n % 32 = ??? 可以将其转 ...

  5. 整除/ 与 求余% 运算

    C++自学精简教程 目录(必读) 整数的除法运算与求余运算 计算机计算整数除法和求余依照下图所示的逻辑计算: 用整数除法判断会遇到一个坑: 7/2 == 3 6/2 == 3 所以: 7/2 == 6 ...

  6. c语言余一个负数_C语言负数的除法和求余运算

    假定我们让 a 除以 b,商为 q,余数为 r: q = a / b; r = a % b; 这里,不妨假定 b 大于 0. 我们希望 a.b.q.r 之间维持怎样的关系呢? 1.最重的一点,我们希望 ...

  7. c语言精髓之编译过程,C语言精髓知识点

    1.字节数: Char:1个字节 Unsigned:1个字节 Short:2/4个字节 Int:2/4个字节 Unsigned int:2/4个字节 编译器在32位一下: Long:4个字节 Unsi ...

  8. 实数范围内(包含负数)的求模与求余运算异同

    以下内容主要总结整理自以下文献: 一.实数的取余运算 二.取模和取余的区别 三.负数.取模与取余 背景 最近在一道 Java 习题中,看到这样的一道题: What is the output when ...

  9. C语言-算术表达式-加,减,乘,除,求余

    C语言的一些编程的注意点: 1.#include<stdio.h>为头文件,一定要写,这个头文件与printf有关.是C语言源代码不可或缺的组成部分. 2.main函数,在程序中有且仅有一 ...

  10. c语言编译为机器语言过程,C语言编译全过程

    C语言编译全过程 编译的概念 编译程序读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码,再由汇编程序转换为机器语言,并且按照操作系统对可执行文件格式的要求链接生成 ...

最新文章

  1. 编程控制Word文档中Table的赋值
  2. vim中搭建与sourceinsight类似功能
  3. iOS网络编程之同步、异步、请求队列
  4. 浅析 Mybatis 与 Hibernate 的区别与用途
  5. java性能监视_Java 9和应用程序性能监视的激动人心之处
  6. Linux 命令快捷键
  7. python入门之函数调用第三关-Python 基础3 函数function
  8. Linux 基础命令3 shell
  9. 服务器上多个php,php – 在多个服务器上扩展cronjobs
  10. html 显示动态时间
  11. 八类网线和七类网线的区别_超6类和7类网线的区别
  12. 计算机教育思维,计算机教育中计算思维的培育
  13. 前台请求报:ERR_EMPTY_RESPONSE错误
  14. Python 爬取手机 豆果美食app存Mongodb
  15. 【欧拉降幂公式】【欧拉函数】
  16. Epson针式打印机打印十六进制内容解决方案
  17. VMWare中CentOS7增加系统盘空间
  18. 【JAVA面试题】java面试题100道详解
  19. 【POJ No. 2431】 丛林探险 Expedition
  20. 好用的翻译软件-大家都在用的互译软件

热门文章

  1. Solr 原理、API 使用
  2. 如何在Windows下载pygame
  3. Java基础练习题——查找整数
  4. Golang编程语言简介 go语言特点
  5. 转:知识管理概念综述(一)
  6. 快应用广告开发、各大手机平台测试id、错误码汇总
  7. python实现自动化打印
  8. UVC协议CT_ZOOM_RELATIVE_CONTROL选择子放大缩小停止的问题
  9. Java jdk 1.8版本安装包
  10. win7便签backup