看<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

3852

被折叠的 条评论
为什么被折叠?



