首页 技术 正文
技术 2022年11月17日
0 收藏 792 点赞 4,757 浏览 988 个字

假定我们让 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<HASHSIZE。又如果己知 n 恒为非负,那么我们只需要像下面一样简单地写:

h=n%HASHSIZE:

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

h = n % HASHSIZE;

if(n < 0)

h += HASHSIZE;

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

测试代码:

#include <stdio.h>
main()
{
int a=-, b=;
int q,r;
q = a / b;
r = a % b;
printf("q=%d, r=%d\n", q, r);
}
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,075
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,551
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,399
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,176
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,811
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,892