Warum erhalte ich mit demselben Code unterschiedliche Ergebnisse?
Ich habe einen Dartcode geschrieben, der js Code folgt, und es gibt ein Problem. Ich hoffe, jemand kann mir helfen.
js code:
var max = 0x80000000;
var data = -2000;
var mod = data % max;
Der Mod-Wert ist -2000
Dartcode:
var max = 0x80000000;
var data = -2000;
var mod = data % max;
Der Mod-Wert ist 2147481648
Warum?
Antworten
Weil JavaScript und Dart unterschiedliche Sprachen mit unterschiedlichen Bedienerspezifikationen sind.
Dart gibt an, dass das verbleibende Operationsergebnis immer positiv ist:
https://api.dart.dev/stable/2.10.4/dart-core/num/operator_modulo.html
In JavaScript kann der Rest negativ sein, das Vorzeichen des Ergebnisses entspricht dem Vorzeichen der Dividende:
https://www.ecma-international.org/ecma-262/11.0/index.html#sec-numeric-types-number-remainder
Dart hat zwei "Modulo" -Operatoren für ganze Zahlen %
(auch bekannt als "Modulo" ) und remainder
.
Sie unterscheiden sich für negative Operanden darin, ob das Ergebnis das Vorzeichen der Dividende oder des Divisors hat. Für positive Operanden stimmen die beiden überein.
Vergleichen Sie:
void main() {
for (var a in [5, -5]) {
for (var b in [3, -3]) {
print("$a ~/ $b = ${a ~/ b}"); print("$a % $b = ${a % b}");
print("$a.remainder($b) = ${a.remainder(b)}"); print("$a = $b * ($a ~/ $b) + $a.remainder($b) = ${b * (a ~/ b) + a.remainder(b)}");
}
}
}
Dieser Code zeigt alle Kombinationen und das a == (a ~/ b) * b + a.remainder(b)
im Allgemeinen.