Evm
為什麼 return ((2**256-1)+5)%15 不會溢出?
我正在編寫一個智能合約,它必須能夠計算兩個數字的總和,以另一個數字為模,總和可能會溢出
2**256-1
。我將其寫為 (a%c+b)%c,以防止溢出。我在 Remix 中測試了 (a+b)%c 只是為了看看會發生什麼,並且它在進行僅返回值的純計算時有效。它不適用於寫入變數或使用值作為映射中的鍵。為什麼它適用於 return (a+b)%c?為了避免溢出,EVM 計算的步驟是什麼?
solidity 編譯器具有 整數文字表達式,該表達式在編譯時使用任意長度的算術進行評估,支持精度高於 EVM 256 位的中間值。如果最終結果符合正確的類型,它將起作用。
連結文件中的一個範例,中間結果不適合 uint256,但最終結果為 1 並且適合 uint8
uint8 public y = 2**800 + 1 - 2**800;