微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

乘法显式转换不起作用 C

如何解决乘法显式转换不起作用 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;
}

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。