Perché ottengo risultati diversi con lo stesso codice?
Ho scritto del codice dart seguendo il codice js e c'è un problema, spero che qualcuno possa aiutarmi /
codice js:
var max = 0x80000000;
var data = -2000;
var mod = data % max;
il valore mod è -2000
Codice dardo:
var max = 0x80000000;
var data = -2000;
var mod = data % max;
il valore mod è 2147481648
Perché?
Risposte
Perché JavaScript e Dart sono linguaggi diversi con specifiche dell'operatore diverse.
Dart specifica che il risultato dell'operazione resto è sempre positivo:
https://api.dart.dev/stable/2.10.4/dart-core/num/operator_modulo.html
In JavaScript il resto può essere negativo, il segno del risultato è uguale al segno del dividendo:
https://www.ecma-international.org/ecma-262/11.0/index.html#sec-numeric-types-number-remainder
Dart ha due operatori "modulo" su numeri interi, %(aka. Modulo) e remainder.
Differiscono per gli operandi negativi se il risultato prende il segno del dividendo o del divisore. Per gli operandi positivi i due sono d'accordo.
Confrontare:
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)}");
}
}
}
Questo codice mostra tutte le combinazioni e quella a == (a ~/ b) * b + a.remainder(b)in generale.