下面的题目你可以全部都做对么:
- 3/4=?
- 3%4=?
- 3/-4=?
- 3%-4=?
- -3/4=?
- -3%4=?
- -3/-4=?
- -3%-4=?
如果你无法全部准确的做出请看下面的解答
除法的取整分类
除法的取整分为三类:向上取整、向下取整、向零取整。
1、向上取整:向+∞方向取最接近精确值的整数。在这种取整方式下,6/5=2 6/(-5)=-1 6/4=2 6/(-3)=-2
2、向下取整:向-∞方向取最接近精确值的整数。在这种取整方式下,6/5=1 6/(-5)=-2 6/4=1 6/(-3)=-2
3、向零取整:向0方向取最接近精确值的整数,就是舍去小数部分,因此又称截断取整。在这种取整方式下,6/5=1 6/(-5)=-1 6/4=1 6/(-3)=-2
C语言使用向零取整方式,知道如何取整,我们就可以知道如何取模了
有符号之间的出具处理例程如下所示:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/time.h>
#include <assert.h>
//int:4
//long int :8
int main(void)
{
int i,j,k;
int ret;
i = 3;
j = 4;
k = 5;
ret = i % j;
printf("%s %d %d \n",__func__,__LINE__,ret);
ret = i % k;
printf("%s %d %d \n",__func__,__LINE__,ret);
ret = k % j;
printf("%s %d %d \n",__func__,__LINE__,ret);
ret = i / j;
printf("%s %d %d \n",__func__,__LINE__,ret);
ret = i / k;
printf("%s %d %d \n",__func__,__LINE__,ret);
ret = k / j;
printf("%s %d %d \n",__func__,__LINE__,ret);
printf("************************** \n");
i = 3;
j = -4;
k = -5;
ret = i % j;
printf("%s %d %d \n",__func__,__LINE__,ret);
ret = i % k;
printf("%s %d %d \n",__func__,__LINE__,ret);
ret = i / j;
printf("%s %d %d \n",__func__,__LINE__,ret);
ret = i / k;
printf("%s %d %d \n",__func__,__LINE__,ret);
printf("************************** \n");
i = -3;
j = 4;
k = 5;
ret = i % j;
printf("%s %d %d \n",__func__,__LINE__,ret);
ret = i % k;
printf("%s %d %d \n",__func__,__LINE__,ret);
ret = i / j;
printf("%s %d %d \n",__func__,__LINE__,ret);
ret = i / k;
printf("%s %d %d \n",__func__,__LINE__,ret);
printf("************************** \n");
i = -3;
j = -4;
k = -5;
ret = i % j;
printf("%s %d %d \n",__func__,__LINE__,ret);
ret = i % k;
printf("%s %d %d \n",__func__,__LINE__,ret);
ret = i / j;
printf("%s %d %d \n",__func__,__LINE__,ret);
ret = i / k;
printf("%s %d %d \n",__func__,__LINE__,ret);
printf("************************** \n");
return 0;
}
结果如图所示:
有符号和无符号之间的处理:
对于无符号和有符号之间的除法运算,首先会将有符号的数据转换为无符号的数据进行处理,在计算机中负数是用补码表示的,所以需要将负数转换为补码之后进行计算,转换方法可以参考博客https://blog.csdn.net/qq_37600027/article/details/83961882
有符号和无符号数据之间的例程如下所示:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/time.h>
#include <assert.h>
//int:4
//long int :8
int main(void)
{
int ret,j,k;
unsigned int i;
i = 3;
j = 4;
k = 5;
ret = i % j;
printf("%s %d %d \n",__func__,__LINE__,ret);
ret = i % k;
printf("%s %d %d \n",__func__,__LINE__,ret);
ret = k % j;
printf("%s %d %d \n",__func__,__LINE__,ret);
ret = i / j;
printf("%s %d %d \n",__func__,__LINE__,ret);
ret = i / k;
printf("%s %d %d \n",__func__,__LINE__,ret);
ret = k / j;
printf("%s %d %d \n",__func__,__LINE__,ret);
printf("************************** \n");
i = 3;
j = -4;
k = -5;
ret = i % j;
printf("%s %d %d \n",__func__,__LINE__,ret);
ret = i % k;
printf("%s %d %d \n",__func__,__LINE__,ret);
ret = i / j;
printf("%s %d %d \n",__func__,__LINE__,ret);
ret = i / k;
printf("%s %d %d \n",__func__,__LINE__,ret);
printf("************************** \n");
ret = k % i;
printf("%s %d %d \n",__func__,__LINE__,ret);
ret = k / i;
printf("%s %d %d \n",__func__,__LINE__,ret);
printf("************************** \n");
return 0;
}
程序结果为: