乘法显式转换不起作用 C

Multiplication Explicit Casting not working 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;
}

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

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

乘以整数 returns 一个整数。如果结果对于 int 来说太大了,它就会溢出,你会得到依赖于实现的行为。

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

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

这并不意味着“把它们都当作 long long int”,它意味着使用它们的 actual 类型进行乘法运算,然后升级 结果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;
}

这样一来,您就无需担心类型转换,变量将在函数调用过程中隐式升级为更广泛的类型,您的代码将变得更加简洁。