在C语言中,当a和b为整数时,整数除法a/b和floor(a/b)有区别吗?更具体地说,在这两个过程中会发生什么?
a/b
是整数除法。如果 a
或 b
中存在负数,结果将取决于编译器(在 C99 之前,舍入可能朝零或负无穷方向;在 C99+ 中,向零舍入)。结果的类型为 int
。 floor(a/b)
执行相同的除法运算,将结果转换为双精度浮点数,舍弃(不存在的)小数部分,并将结果作为双精度浮点数返回。
C
标签。但是,很明显我的回答是关于 C++ 的。 <g>
- Pete Beckerfloor
并没有四舍五入任何东西,因为 a / b
执行整数除法,然后将其传递给 floor
。 - obataku-4 / 3 == -1
while floor(-4 / 3) == -2
- Geoff Armstrongfloor
返回一个double
,而a/b
,其中a
和b
都是整数,则产生一个整数值。
通过正确的转换,值是相同的。
如果C语言中存在typeof
运算符(实际上不存在),我们会有:
(typeof (a /b)) floor(a / b) == a / b
编辑:现在问题是:以下两者是否有差别:
(double) (a / b)
并且
floor(a / (double) b)
将整数转换为浮点数时可能会丢失信息,对于 int 和 double 类型而言不太可能发生,但稍作修改:
#include <stdio.h>
#include <math.h>
int main(void)
{
unsigned long long a = 9000000000000000003;
unsigned long long b = 3;
printf("a/b = %llu\n", a/b);
printf("floor(a/b) = %f\n", floor(a/b));
return 0;
}
结果:
a/b = 3000000000000000001
floor(a/b) = 3000000000000000000.000000