乘法显式转换不起作用 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;
}
这样一来,您就无需担心类型转换,变量将在函数调用过程中隐式升级为更广泛的类型,您的代码将变得更加简洁。
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;
}
这样一来,您就无需担心类型转换,变量将在函数调用过程中隐式升级为更广泛的类型,您的代码将变得更加简洁。