Warum erhalte ich mit demselben Code unterschiedliche Ergebnisse?

Nov 19 2020

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

5 Patrick Nov 19 2020 at 12:32

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

3 lrn Nov 19 2020 at 16:01

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.