¿Cómo funciona la conversión de tipos uint?

Me parece (me pareció) intuitivo que no hay necesidad de convertir los puntos inferiores (por ejemplo, uint8) en superiores ( uint256) dentro de una fórmula. Como entendí de los documentos de solidez, debería hacerse automáticamente.

¿Me equivoco? ¿Por qué recibo desbordamientos "prematuros" en las siguientes funciones?

Esta función funciona bien hasta numSoldque es inferior o igual a 15999. Después de eso, hay desbordamiento.

function debugPower (uint16 numSold) public constant returns (uint) {
    return uint(2 ** (numSold/1000));
}

Esta función funciona bien hasta numSoldque es menor o igual a 6999. Luego se desborda.

function debugPrice (uint8 x1, uint8 y1, uint16 numSold) private returns (uint80) {
    return uint80(1 finney * (2 ** (numSold/1000))); 
}

Lo mismo que arriba setting_delay nunca ni siquiera cerca de uint32, currentLevelnunca cerca de uint16y el resultado final nunca cerca de uint.

function debugActivationTime (uint32 setting_delay, uint16 currentLevel) public constant returns (uint32) {
    return uint32(now + ((2**(currentLevel-1)) * setting_delay)); 
}
esperando la respuesta tenia la misma pregunta

Respuestas (1)

El problema es que esta expresión:

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

primero evalúa 2 ** (numSold/1000)y deduce el tipo resultante del tipo de numSold. Entonces, el truncamiento ocurre antes de que el valor pueda emitirse. La solución es lanzar numSolda un uint first .

es decir

return 2 ** uint(numSold/1000);