Мне кажется (казалось) интуитивно понятным, что нет необходимости преобразовывать более низкие единицы (например uint8
) в более высокие ( uint256
) в формуле. Насколько я понял из документов Solidity, это должно быть сделано автоматически.
Я ошибаюсь? Почему я получаю «преждевременные» переполнения в функциях ниже?
Эта функция хорошо работает, пока не numSold
станет меньше или равно 15999. После этого происходит переполнение.
function debugPower (uint16 numSold) public constant returns (uint) {
return uint(2 ** (numSold/1000));
}
Эта функция хорошо работает, пока не numSold
станет меньше или равно 6999. Затем произойдет переполнение.
function debugPrice (uint8 x1, uint8 y1, uint16 numSold) private returns (uint80) {
return uint80(1 finney * (2 ** (numSold/1000)));
}
То же, что и выше, setting_delay никогда не приближается к uint32
, currentLevel
никогда не приближается к , uint16
а окончательный результат никогда не приближается к uint
.
function debugActivationTime (uint32 setting_delay, uint16 currentLevel) public constant returns (uint32) {
return uint32(now + ((2**(currentLevel-1)) * setting_delay));
}
Дело в том, что это выражение:
return uint(2 ** (numSold/1000));
сначала оценивает 2 ** (numSold/1000)
и выводит результирующий тип из типа numSold
. Таким образом, усечение происходит до того, как значение может быть приведено. Решение состоит в том, чтобы привести numSold
к uint
первому .
то есть
return 2 ** uint(numSold/1000);
катапульта