乘法显式转换不起作用 C

问题描述

long long int calculateUnits(int tokenVal,int billVal,int numOfTokens,int numOfBills)
{
    long long int units;

    // tokenUnits = billVal * numOfTokens;
    // billUnits = tokenVal * numOfBills;
    units = (long long int)(billVal * numOfTokens) + (long long int)(tokenVal * numOfBills);

    // return number of units
    return units;
}

对于小数字,这很好用。但是一旦乘法结果变得足够大,我就会开始得到负数。我认为显式转换可以解决这个问题。

是我用错了,还是我遗漏了什么?

解决方法

整数相乘返回整数。如果结果对于 int 来说太大,它就会溢出并且您会得到依赖于实现的行为。

您应该将其中一个参数强制转换为 long long,那么结果将为 long long。转换结果不起作用,因为这会在溢出发生后进行转换。

units = ((long long int)billVal * numOfTokens) + ((long long int)tokenVal * numOfBills);
,
(long long int)(billVal * numOfTokens)

这并不意味着“将这两个都当作long long int”,而是使用它们的实际类型进行乘法运算,然后升级结果long long int。乘法,因此任何溢出,都先完成。

您需要做的是强制变量之一为更宽的类型(另一个将隐式升级),以便乘法使用更宽的类型:

(long long int)billVal * numOfTokens

然而,更好的解决方案,因为你想使用更宽的类型,可能是在函数签名中使用更宽的类型:

long long int calculateUnits(long long int tokenVal,long long int billVal,long long int numOfTokens,long long int numOfBills)
{
    return billVal * numOfTokens + tokenVal * numOfBills;
}

这样,您就无需担心强制转换,作为函数调用的一部分,变量将隐式升级为更广泛的类型,并且您的代码变得更加简洁。