Mache ich den Modul falsch? Da in Java -13 % 64
sollte bewerten , -13
aber ich erhalte 51
.
%
ist ein Restoperator.
Mache ich den Modul falsch? Da in Java -13 % 64
sollte bewerten , -13
aber ich erhalte 51
.
%
ist ein Restoperator.
Antworten:
Beide Definitionen des Moduls negativer Zahlen werden verwendet - einige Sprachen verwenden eine Definition und andere die andere.
Wenn Sie eine negative Zahl für negative Eingänge erhalten möchten, können Sie Folgendes verwenden:
int r = x % n;
if (r > 0 && x < 0)
{
r -= n;
}
Ebenso, wenn Sie eine Sprache verwenden, die bei einer negativen Eingabe eine negative Zahl zurückgibt, und Sie eine positive bevorzugen würden:
int r = x % n;
if (r < 0)
{
r += n;
}
x % y
A) gegeben ist, x
ist der Rest negativ, dh negativ x % y == -(-x % y)
. B) das Zeichen von y
hat keine Wirkung, dhx % y == x % -y
Da "mathematisch" beide richtig sind:
-13 % 64 = -13 (on modulus 64)
-13 % 64 = 51 (on modulus 64)
Eine der Optionen musste von Java-Sprachentwicklern ausgewählt werden und sie wählten:
Das Vorzeichen des Ergebnisses entspricht dem Vorzeichen der Dividende.
Sagt es in Java-Spezifikationen:
https://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.17.3
-13 % 64 = 51
als ich erwartet hatte -13
?".
int result = (-5) % 3;
gibt -2. int result = (-3) % 5;
gibt -3. Gibt im Allgemeinen int result = (-a) % b;
die richtige Antwort, wenn | -a | > b. Um das richtige Ergebnis zu erhalten, wenn | -a | <b wir sollten den Divisor einwickeln. int result = ((-a) % b) + b;
für negative a oder int result = (((-a) % b) + b) % b;
für positive oder negative a
Ihr Ergebnis ist für Java falsch. Bitte geben Sie einen Kontext an, wie Sie dazu gekommen sind (Ihr Programm, Ihre Implementierung und Ihre Java-Version).
Von dem Java-Sprachspezifikation
15.17.3 Restbetreiber%
[...]
Die für Operanden, die nach der binären numerischen Heraufstufung Ganzzahlen sind (§5.6.2), erzeugt einen Ergebniswert, so dass (a / b) * b + (a% b) gleich ist ein.
15.17.2 Abteilungsbetreiber /
[...]
Integer Division rundet auf 0.
Da / gegen Null gerundet ist (was zu Null führt), sollte das Ergebnis von% in diesem Fall negativ sein.
int result = (-5) % 3;
gibt -2 int result = (-3) % 5;
gibt -3 Gibt im Allgemeinen int result = (-a) % b;
die richtige Antwort, wenn | -a | > b Um das richtige Ergebnis zu erhalten, wenn | -a | <b wir sollten den Divisor einwickeln. int result = ((-a) % b) + b;
für negativ a oder int result = (((-a) % b) + b) % b;
für positiv oder negativ a.
(-3) % 5
das richtige Ergebnis gemäß der Definition -3
, und eine korrekte Implementierung von Java sollte dieses Ergebnis erzeugen.
(-3)%5
tatsächlich -3
, und wenn wir den positiven Rest wollen, sollten wir 5 hinzufügen, und dann wird das Ergebnis sein2
Sie können verwenden
(x % n) - (x < 0 ? n : 0);
((x % k) + k) % k
. (Obwohl Ihre wahrscheinlich besser lesbar ist.)
[0, sign(divisor) * divisor)
statt liegt [0, sign(dividend) * divisor)
.
Ihre Antwort ist in Wikipedia: Modulo-Betrieb
Es heißt, dass in Java das Vorzeichen für die Modulo-Operation das gleiche ist wie das der Dividende. und da wir über den Rest der Divisionsoperation sprechen, ist es in Ordnung, dass sie in Ihrem Fall -13 zurückgibt, da -13/64 = 0. -13-0 = -13.
EDIT: Sorry, habe deine Frage falsch verstanden ... Du hast recht, Java sollte -13 geben. Können Sie mehr umgebenden Code bereitstellen?
Die Modulo-Arithmetik mit negativen Operanden wird vom Sprachdesigner definiert, der sie möglicherweise der Sprachimplementierung überlässt und die Definition möglicherweise auf die CPU-Architektur verschiebt.
Ich konnte keine Java-Sprachdefinition finden.
Dank Ishtar sagt die Java-Sprachspezifikation für den Restoperator% , dass das Vorzeichen des Ergebnisses mit dem Vorzeichen des Zählers übereinstimmt.
x = x + m = x - m
im Modul m
.
also -13 = -13 + 64
im Modul 64
und -13 = 51
im Modul 64
.
Nehmen wir an Z = X * d + r
, wenn wir 0 < r < X
dann in Division den Rest nennen. gibt den Rest von zurück .Z/X
r
Z % X
Z/X
Die Mod-Funktion ist definiert als der Betrag, um den eine Zahl das größte ganzzahlige Vielfache des Divisors überschreitet, das nicht größer als diese Zahl ist. Also in deinem Fall von
-13 % 64
Das größte ganzzahlige Vielfache von 64, das -13 nicht überschreitet, ist -64. Wenn Sie nun -13 von -64 subtrahieren, entspricht dies 51-13 - (-64) = -13 + 64 = 51
In meiner Version von Java JDK 1.8.0_05 -13% 64 = -13
Sie könnten versuchen, -13- (int (-13/64)), mit anderen Worten, eine Division in eine ganze Zahl umzuwandeln, um den Bruchteil zu entfernen, und dann vom Zähler zu subtrahieren. Also sollte Zähler- (int (Zähler / Nenner)) das Richtige geben Rest & Zeichen
In Java erhalten Sie die neuesten Versionen -13%64 = -13
. Die Antwort hat immer ein Zählerzeichen.
Gemäß Abschnitt 15.17.3 des JLS "erzeugt die Restoperation für Operanden, die nach der binären numerischen Heraufstufung ganze Zahlen sind, einen Ergebniswert, so dass (a / b) * b + (a% b) gleich a ist. Diese Identität gilt gerade in dem speziellen Fall, dass die Dividende die negative ganze Zahl von größtmöglicher Größe für ihren Typ ist und der Divisor -1 ist (der Rest ist 0). "
Hoffentlich hilft das.
Ich glaube nicht, dass Java in diesem Fall 51 zurückgibt. Ich verwende Java 8 auf einem Mac und bekomme:
-13 % 64 = -13
Programm:
public class Test {
public static void main(String[] args) {
int i = -13;
int j = 64;
System.out.println(i % j);
}
}