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 numSold
que 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 numSold
que 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
, currentLevel
nunca cerca de uint16
y 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));
}
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 numSold
a un uint
first .
es decir
return 2 ** uint(numSold/1000);
katapulte