c语言的小例子,被除数和被求余数是负数的疑问。

#include<stdio.h>
int a,b,c,d;
int main()
{
a=5/-3; /* 被除数是负数,结果为负数*/
printf("a=%d\n",a);
b=-5/-3; /* 被除数是负数,除数是负数,负负得正,结果为正数*/
printf("b=%d\n",b);
c=5%-3; /* 被求余数是负数,结果为负数*/
printf("c=%d\n",c);
d=-5%-3; /* 被求余数是负数,余数也是负数,负负得正,结果为正数*/
printf("d=%d\n",d);
}
/*得出的结果是a=-1,b=1,c=2,d=-2,c和d的答案怎么会这样,不知道是哪里操作错误了*/

请大侠指点迷津下,谢谢了。

操作符‘/’和‘%’代表整除和取余:若x和y都是正整数时x/y和x%y的结果都容易确定;但当x和y有负数时,结果就和具体的机器有关,但必有满足x=(x/y)*y+x%y。

所以c=5%-3=5-(5/-3)*(-3)=5+1*(-3)=2
d=-5%-3=-5-(-5/-3)*(-3)=-5-1*(-3)=-5+3=-2追问

我想得出 5%-3,应该怎么样用C语言里面的公式表达呢

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-11-26
这个问题在C语言早期是没有固定的规定的,所以一些书中会有谁这种行为值不固定,是编译器而决定,但是现在C99中有强制规定了,要求对于整型数a,b,必然满足a%b==a-(a/b)*b
PS,其实这一点在K&R第二版中就有提到追问

c=5%-3;,是不是这一段不适用,我用的是vc++6.0

追答

你大概误会我的意思了
我说的C99规定的是强制在对于负数除法时使用"趋零截尾"的方式计算
即5/-3==-1
虽然在此之前绝大多数编译器对此的做法都是趋零截尾的,但是毕竟标准里没有强制要求,还是有些编译器,使用的还是四舍五入的形式方式处理负数除法
vc6是典型的趋零截尾的,满足
2==5-(-1)*(-3)

追问

对负数的取模运算,C99规定:如果第一操作数为负,则得到的模为负;如果第一操作数为正,则得到的模为正。也就是说这是C的规定。真正的答案不用C的话,就用算术来计算是不是5%-3=-2.95,而在C语言当中就是为第一操作数的正整数,也就是2了。我比较关心,要是我用C来计算这样的问题,那么得出的结果和真正的结果不一样了,只不过是C的结果,遇到这样的问题我应该怎么写这段代码,得到真正的结果。麻烦你了。

本回答被提问者采纳
第2个回答  2013-10-13
5%-3:(-3)*(-1)+2
-5%-3:(-3)*(1)-2
总之,商和除数乘积要与被除数符号一致。
第3个回答  2013-10-13
这个必须把负号提在最前面。如a=(-)5/3追问

a=(-)5/3,这条运行不了吧

第4个回答  2013-10-13
自己搞错了吧!追问

哪个地方错了呢,请指点笑傲

相似回答