【发布时间】:2018-12-01 19:21:40
【问题描述】:
以int a=INT_MAX-1; 和int b=INT_MAX-1; 为例,假设 int 是 32 位的并且是一个函数
int product(int a,int b)
{
return a*b;
}
现在产品a*b 溢出,导致标准未定义行为:
如果在评估过程中出现异常情况 表达式(也就是说,如果结果不是数学定义的,或者 不在其类型的可表示值范围内),行为 未定义。
但是如果我们改为使用
int product(int a,int b)
{
long long x = (long long)a*b;
return x;
}
然后假设this answer 是正确的并且适用于long long,按照标准,结果是实现定义的。
我认为未定义的行为可能会导致任何事情,包括崩溃,因此最好避免所有成本,因此第二个版本更可取。但我不太确定我的推理是否正确。
问题:第二个版本更可取还是第一个版本更可取?
【问题讨论】:
-
除非你从第二个版本返回
long long并将返回的值分配给long long类型,否则你仍然有溢出。 -
一个会导致 UB,一个不会...我会说它们都很糟糕。不太确定你在这里期待什么样的答案
-
@taskinoor 实际上在第二种情况下它超出了范围分配,而不是溢出(参见问题链接的答案)
-
@MM 对,我错了。我同意你,他们两个都是坏人。
-
猜猜这取决于用例。如果使用的是
total_charge = product(unit_price, items_sold);,而您从发票中扣除了数十亿美元,我宁愿程序崩溃也不愿破产。 :-)
标签: c implicit-conversion integer-overflow