09-除法运算符
5.2.6 除法运算符: /
C使用符号 / 来表示除法。 / 左侧的值是被除数,右侧的值是除数。例如,下面 four 的值是 4.0 :
four = 12.0/3.0;
整数除法和浮点数除法不同。浮点数除法的结果是浮点数,而整数除法的结果是整数。整数是没有小数部分的数。这使得5除以3很让人头痛,因为实际结果有小数部分。在C语言中,整数除法结果的小数部分被丢弃,这一过程被称为截断(truncation)。
运行程序清单5.6中的程序,看看截断的情况,体会整数除法和浮点数除法的区别。
程序清单5.6 divide.c 程序
/* divide.c -- 演示除法 */
#include <stdio.h>
int main(void)
{
printf("integer division: 5/4 is %d \n", 5 / 4);
printf("integer division: 6/3 is %d \n", 6 / 3);
printf("integer division: 7/4 is %d \n", 7 / 4);
printf("floating division: 7./4. is %1.2f \n", 7. / 4.);
printf("mixed division: 7./4 is %1.2f \n", 7. / 4);
return 0;
}
程序清单5.6中包含一个“混合类型”的示例,即浮点值除以整型值。C相对其他一些语言而言,在类型管理上比较宽容。尽管如此,一般情况下还是要避免使用混合类型。该程序的输出如下:
integer division: 5/4 is 1
integer division: 6/3 is 2
integer division: 7/4 is 1
floating division: 7./4. is 1.75
mixed division: 7./4 is 1.75
注意,整数除法会截断计算结果的小数部分(丢弃整个小数部分),不会四舍五入结果。混合整数和浮点数计算的结果是浮点数。实际上,计算机不能真正用浮点数除以整数,编译器会把两个运算对象转换成相同的类型。本例中,在进行除法运算前,整数会被转换成浮点数。
C99标准以前,C语言给语言的实现者留有一些空间,让他们来决定如何进行负数的整数除法。一种方法是,舍入过程采用小于或等于浮点数的最大整数。当然,对于 3.8 而言,处理后的 3 符合这一描述。但是 -3.8 会怎样?该方法建议四舍五入为 -4 ,因为 -4 小于 -3.8 。但是,另一种舍入方法是直接丢弃小数部分。这种方法被称为“趋零截断”,即把 -3.8 转换成 -3 。在C99以前,不同的实现采用不同的方法。但是C99规定使用趋零截断。所以,应把 -3.8 转换成 -3 。