Ich muss ein size_t volume
nehmen und dieses Ergebnis in size_t
:
Wenn dieses Ergebnis überläuft, sollte size_t
und next
gleich null sein. Das Problem ist natürlich, dass volume * 8 + 3
überlaufen kann, während das gesamte Ergebnis in ein size_t
passt.
Im Moment spalte ich die letzten 4 Bits von volume
und führe die Multiplikation, Addition und Division getrennt durch. Meine Frage ist: Kann ich besser als das, was ich bisher gemacht habe, wenn es keinen Typ gibt, der größer ist als size_t
?
Es könnte einige Fehler in diesem Code geben. Ich habe es noch nicht umfassend getestet, aber ich glaube, dass alle wichtigen Ideen da sind.
Lassen Sie vol1 = volume % 5
, vol2 = volume - vol1
. vol2 ist durch 5 teilbar, also mathematisch (vol2 * 8) / 5 = (vol2 / 5) * 8, so erhalten Sie das korrekte Ergebnis als
Offensichtlich erhalten Sie einen Überlauf, wenn das Ergebnis nicht in size_t passt, aber nicht, wenn irgendwo in der Berechnung ein Überlauf auftritt. Da Sie mit 8/5 multiplizieren, wird das Ergebnis im Falle eines Überlaufs etwa 0,6 * Volumen & lt; Volumen, so können Sie
zurückgeben %Vor%was sicherlich besser ist als 0 zurück zu geben.
Tags und Links c