将B除以A的最安全的方法是什么,假设每种方式都有以下类型?
unsigned long long A;
unsigned long int B;
我已经使用以下行来执行此操作。它运行正常,但有时它会因分段错误而失败。
double C;
C= double(B)/double(A);
由于
答案 0 :(得分:4)
(首先,unsigned long int
与unsigned long
)
数据类型提升规则意味着在评估A / B
时,B
被提升为unsigned long long
,并且除法以整数算术执行;即任何遗失都会丢失。
将or B
投射到double
会导致操作以浮点double
执行。 (但请注意,将long long
类型转换为double
会导致精度损失。)
请放心,C = double(B) / double(A);
不会导致细分错误。在此语句之前,您必须具有内存损坏/其他未定义的行为。我怀疑你搞砸了你的筹码。
答案 1 :(得分:2)
这些是整数,所以不需要强制转换为双精度,除非你实际上期望浮点小数结果(即你可能想要投射,但这与你的错无关)。
由于除以零,你很可能会收到错误。