请考虑下面的代码:如何通过乘法避免整型溢出而无需类型转换?
unsigned int var1 = 4294967295;
unsigned int var2 = 1000000;
unsigned int var3;
var3 = some_expression - (var1*var2)/some_expression;
缺陷:
在用于VAR3的表达,该值:
(VAR1 * VAR2)被截断为32位整数(因为它是通过乘以2个32位整数获得的)。
可能的修正:
var3 = some_expression - ((unsigned long int)var1*var2)/some_expression;
问题:
的Solaris确实不接受这种类型转换&引发以下错误:
“转换为非标量类型请求”
我能否解决此问题而不进行类型转换?
没有什么是错误的。无论Solaris编译器是否损坏,请使用更好的编译器,或者'some_expression'中有错误,请向我们展示您的真实代码。 –
为什么不首先避免溢出?一世。e首先进行分割,然后乘法 - (var1/someExpression)* var2 – enhzflep
@enhzflep通常,'var1/someExpression * var2'不会给出与'var1 * var2/someExpression'相同的答案,因为整数分割会截断。 –