Wie funktioniert die Konvertierung von uint-Typen?

Es scheint mir intuitiv, dass es nicht notwendig ist, innerhalb einer Formel niedrigere Einheiten (z. B. uint8) in höhere ( ) umzuwandeln. uint256Wie 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 numSoldkleiner 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 numSoldkleiner 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, currentLevelniemals annähernd uint16und 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)); 
}
Warten auf die Antwort Ich hatte die gleiche Frage

Antworten (1)

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, numSoldin eine uint erste umzuwandeln .

dh

return 2 ** uint(numSold/1000);