Es scheint mir intuitiv, dass es nicht notwendig ist, innerhalb einer Formel niedrigere Einheiten (z. B. uint8
) in höhere ( ) umzuwandeln. uint256
Wie ich aus den Solidity-Dokumenten verstanden habe, sollte dies automatisch erfolgen.
Liege ich falsch? Warum erhalte ich "vorzeitige" Überläufe in den folgenden Funktionen?
Diese Funktion funktioniert gut, bis numSold
kleiner oder gleich 15999 ist. Danach gibt es einen Überlauf.
function debugPower (uint16 numSold) public constant returns (uint) {
return uint(2 ** (numSold/1000));
}
Diese Funktion funktioniert gut, bis numSold
kleiner oder gleich 6999 ist. Dann überlaufen.
function debugPrice (uint8 x1, uint8 y1, uint16 numSold) private returns (uint80) {
return uint80(1 finney * (2 ** (numSold/1000)));
}
Dasselbe wie oben setting_delay niemals annähernd uint32
, currentLevel
niemals annähernd uint16
und das Endergebnis niemals annähernd uint
.
function debugActivationTime (uint32 setting_delay, uint16 currentLevel) public constant returns (uint32) {
return uint32(now + ((2**(currentLevel-1)) * setting_delay));
}
Das Problem ist, dass dieser Ausdruck:
return uint(2 ** (numSold/1000));
wertet zuerst 2 ** (numSold/1000)
aus und leitet den resultierenden Typ vom Typ von ab numSold
. Die Kürzung findet also statt, bevor der Wert überhaupt gecastet werden kann. Die Lösung besteht darin, numSold
in eine uint
erste umzuwandeln .
dh
return 2 ** uint(numSold/1000);
katapultieren