Как работает преобразование типов uint?

Мне кажется (казалось) интуитивно понятным, что нет необходимости преобразовывать более низкие единицы (например 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)); 
}
жду ответа у меня был тот же вопрос

Ответы (1)

Дело в том, что это выражение:

return uint(2 ** (numSold/1000));

сначала оценивает 2 ** (numSold/1000)и выводит результирующий тип из типа numSold. Таким образом, усечение происходит до того, как значение может быть приведено. Решение состоит в том, чтобы привести numSoldк uint первому .

то есть

return 2 ** uint(numSold/1000);