除法运算的注意点

看<c陷阱与缺陷>这本书是看到除法运算截断问题:(书中所说的截断是,余数与除数同号,但现实中并不是这样的。)。

先来看一下下面的运行结果:

/* Note:Your choice is C IDE */
#include "stdio.h"
void main()
{
    int a=5;
	int b=3;
	int c=a/b;
	int d=a%b;
	printf("a>0,b>0,c=%d,d=%d\n",c,d);
	a=-5;
	c=a/b;
	d=a%b;
	printf("a<0,b>0,c=%d,d=%d\n",c,d);
	a=5;
	b=-3;
	c=a/b;
	d=a%b;
	printf("a>0,b<0,c=%d,d=%d\n",c,d);
	a=-5;
	b=-3;
	c=a/b;
	d=a%b;
	printf("a<0,b<0,c=%d,d=%d\n",c,d);
	
}
a>0,b>0,c=1,d=2
a<0,b>0,c=-1,d=-2
a>0,b<0,c=-1,d=2
a<0,b<0,c=1,d=-2



             Press any key to continue

来小学就知道a除以b,商为c,余数为d,则会有:a==c*b+d.

从中可以看到商是正确的的正负号由a,b共同决定,但是余数的正负号只由a(被除数)决定。

余数的正负号只由a(被除数)决定会引起一个编程中的注意点:

当我们在利用余数进行一些处理时,某些情况要求余数大于0,从而转换为要求被除数大于0,如linux内核中经常用到hash表,而它的key值,有些是利用余数来求的。从而余数要在0.……MAXSIZE-1之间。

若某个不经意,把被除数变成了负的,就会引发大的问题。

从而,h=n%MAXSIZE

一般来说有两种方式处理:

h=n%MAXSIZE;
if(h<0)
	h+=MAXSIZE;
更好的方式就是n为unsigned


转载请标明出处:http://blog.csdn.net/lin200753/article/details/27975139

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值