請考慮下面的代碼:如何通過乘法避免整型溢出而無需類型轉換?
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'相同的答案,因爲整數分割會截斷。 –