2017-04-30 3 views
-1

Das CodefragmentArbeiten mit Werten von ganzen Zahlen und ihre maxes

int x = < an integer value >; 
System.out.println(x*x); 

Displays -131071. Welcher der folgenden Werte ist ein möglicher Wert von x?

Offenbar ist die Antwort 2^16 - 1.

Ich weiß nicht einmal, wie das eine Antwortwahl war. Wie soll ich dieses Problem ohne einen Rechner lösen?


Die Aussage

System.out.println(Integer.MAX_VALUE); 

druckt 2147483647, die 2^31 - 1 gleich ist. Wie wird die folgende Anweisung gedruckt?

System.out.println(Integer.MAX_VALUE + 2); 

Die Antwort war -2137483546. Ich bin verwirrt wie, sollte es nicht eine arithmetische Ausnahme verursachen, da wir außerhalb der Grenzen sind?

Ich stelle diese Fragen nicht für Sie, um sie für mich zu tun? Könnten Sie mir die Argumentation geben und nicht nur die Antworten (die ich bereits habe)? Ich bin nur verwirrt über die Manipulation mit ints in der Nähe ihrer maximalen Werte.

+1

Kennen Sie [Zweierkomplement] (https://en.wikipedia.org/wiki/Two%27s_complement)? –

+0

Ist das Komplement nicht der Minimalwert? @OliverCharlesworth – Asker123

+0

@OusmaneMahyDiaw Ich versuche nicht für eine Ausnahme. Das ist eine Frage, die ich beantworten muss. Ich kann die Frage nicht manipulieren. – Asker123

Antwort

1

würde ich durch das Schreiben -131.071 in einer nützlicheren Form starten: 0xfffe0001

Jetzt x * x == 0xfffe0001 nur lösen. Offensichtlich x ist ungerade, sonst könnte sein Quadrat nie ungerade sein. Dieses Argument kann weiter gehen: Modulo 2 wir x * x = 1 bekommen, so ist x entweder 1 oder -1 modulo 2 da dies die einzigen Quadratwurzeln 1.

So gibt es nur zwei Möglichkeiten für das sind untere 16 Bits, was ist mit den oberen 16?

Zuerst versuchen wir 0xffff (aka -1 modulo 2) für die unteren 16 Bits. Das (dh die oberen 16 Bits sind Null) stellt sich sofort als "langweilig" heraus. Hier ist ein schöner Grund: Die ursprüngliche Zahl war 2 -2 +1 (gut sichtbar von seiner hexadezimalen Darstellung), die in Faktoren (2 -1) , tun nur die üblichen „reverse square“Ding, sO 2 32 ist ein 2, -2 = 2ab und 1 = b 2 .

Aber das ist nur eine Möglichkeit, es gibt mehr:

  • 0x0000FFFF = 2 -1
  • 0x8000ffff = 2 +2 -1 (2 annulliert , wenn Sie es quadrieren)

Erinnern Sie sich, wie die unteren 16 Bits coul d 1 sein? Das gibt auch 2 Möglichkeiten:

  • 0x7fff0001
  • 0xffff0001

sollte es keine ArithmeticException verursachen, da wir außerhalb der Grenzen gehen?

Nicht mit Standard-Arithmetik, aber siehe Math.multiplyExact und Freunde. Von den normalen Operatoren, / und % können werfen, die anderen sind glücklicherweise sicher.