【发布时间】:2016-08-08 09:47:41
【问题描述】:
代码
#include<stdio.h>
#include<limits.h>
#include<float.h>
int f( double x, double y, double z){
return (x+y)+z == x+(y+z);
}
int ff( long long x, long long y, long long z){
return (x+y)+z == x+(y+z);
}
int main()
{
printf("%d\n",f(DBL_MAX,DBL_MAX,-DBL_MAX));
printf("%d\n",ff(LLONG_MAX,LLONG_MAX,-LLONG_MAX));
return 0;
}
输出
0
1
我无法理解为什么这两个函数的工作方式不同。这里发生了什么?
【问题讨论】:
-
这两个函数都会导致未定义的行为。
-
@2501 但为什么是未定义的行为?
-
签名变量溢出是UB。
-
您的添加超出了数字限制:您所做的是未定义的行为。 double 和 long 的二进制编码是不同的,因此在这里有不同的结果可以被认为是“正常的”,但同样你的代码是未定义的行为,应该被认为是不可预测的
-
@utkarsh13 如果您将最大可能的数字和最大可能的数字相加,您希望结果是什么?