Ein Weg, um die verschiedenen zu sehen, ist eine schnelle Simulation in einem Prüfstand laufen, für Beispiel nicht verstehen mit diesem einen Prozess wie:
process is
begin
report " 9 mod 5 = " & integer'image(9 mod 5);
report " 9 rem 5 = " & integer'image(9 rem 5);
report " 9 mod (-5) = " & integer'image(9 mod (-5));
report " 9 rem (-5) = " & integer'image(9 rem (-5));
report "(-9) mod 5 = " & integer'image((-9) mod 5);
report "(-9) rem 5 = " & integer'image((-9) rem 5);
report "(-9) mod (-5) = " & integer'image((-9) mod (-5));
report "(-9) rem (-5) = " & integer'image((-9) rem (-5));
wait;
end process;
Es zeigt das Ergebnis zu sein:
# ** Note: 9 mod 5 = 4
# ** Note: 9 rem 5 = 4
# ** Note: 9 mod (-5) = -1
# ** Note: 9 rem (-5) = 4
# ** Note: (-9) mod 5 = 1
# ** Note: (-9) rem 5 = -4
# ** Note: (-9) mod (-5) = -4
# ** Note: (-9) rem (-5) = -4
hat eine ausführliche Beschreibung, die Regeln einschließlich:
- mod hat Zeichen der Divisor, so
n
in a mod n
- rem hat Zeichen der Dividende, so
a
in a rem n
Der mod
Operator gibt der Rest für eine Division, die abgerundet wird (floored Division), so a = floor_div(a, n) * n + (a mod n)
. Der Vorteil ist, dass a mod n
ein wiederholter Sägezahngraph ist, wenn a
sogar durch Null ansteigt, was in einigen Berechnungen wichtig ist.
Der Operator rem
gibt den Rest für die reguläre Ganzzahldivision a/n
, die in Richtung 0 (abgeschnittene Division) rundet, also a = (a/n) * n + (a rem n)
.
http://computer-programming-forum.com/42-vhdl/6f9dce015f5ce94f.htm –