Frage

Ich war eine dritte Partei Quellcode Scannen Findbugs mit (nur vorsichtig sein, bevor man in sie zu integrieren Minen) und fand die folgende Warnung:

long a = b << 32 | c
  

Bug: Integer Verschiebung um 32 Pattern-ID:   ICAST_BAD_SHIFT_AMOUNT, Typ: BSHIFT,   Kategorie: RICHTIGKEIT

     

Der Code führt eine ganze Zahl von Schalt   eine konstante Menge außerhalb des Bereichs   0..31. Die Wirkung davon ist, die unteren 5 Bits des ganzzahligen Wert zu verwenden,   zu entscheiden, wie viel von zu verschieben. Diese   wahrscheinlich wollen, ist nicht zu erwarten war, und   es zumindest verwirrend.

Könnte jemand bitte erklären, was genau macht die oben bedeuten?

Danke! (Ich bin ziemlich ein Neuling in Java-Programmierung)

War es hilfreich?

Lösung

Von der Java Language Specification :

  

Falls der begünstigt Typ des linken Operanden int ist, nur die fünf niederwertigsten Bits des rechten Operanden werden als die Verschiebungsstrecke verwendet. Es ist, als ob der rechte Operand auf eine bitweise unterworfen wurde logische UND-Operator & (§15.22.1) mit dem Maskenwert 0x1f. Die Verschiebungsstrecke verwendete tatsächlich ist daher immer im Bereich von 0 bis einschließlich 31.

Also, wenn b eine int, der Ausdruck ist identisch mit

long a = b | c;

die ich sehr Zweifel ist, was beabsichtigt ist. Es sollte wohl gewesen sein

long a = ((long) b << 32) | c;

(Wenn b bereits eine lange ist, wird der Code korrekt ist und FindBugs irrt über den Bug).

Andere Tipps

Editiert: Das Problem fast stammt sicherlich aus der Tatsache, dass 'b' ist ein 'int' und kein 'long'

.

C, wenn ‚b‘ eine ganze Zahl statt einer langen und Sie Verschiebung um 32 Bits nach links, alle Bits vom ursprünglichen Wert entfernt worden, so das Ergebnis der Gesamtausdruck wäre das gleiche, als ‚c‘ würden Sie nicht definiertes Verhalten aufrufen, so dass jede Folge ist zulässig. Java definiert die Dinge anders - wie im Kommentar von Rasmus Faber und der gewählten Antwort darauf hingewiesen - und der überlangen verschiebt die maximale Anzahl von Bits Modulo, die verschoben werden können. [Es scheint eine seltsame Art und Weise, Geschäfte zu machen; Ich würde wahrscheinlich eine Ausnahme in einer Sprache habe angeordnet, die sie hat. Es ist jedoch klar definiert, was wichtiger ist als genau das, was die Definition] Der Zwang auf 64 Bits nicht auftritt, während der Ausdruck ausgewertet wird. es tritt auf, wenn der Ausdruck abgeschlossen ist und die Zuordnung geschieht.

Der Verweis auf 5 Bits ist ... faszinierend. Es bedeutet, dass, wenn Sie durch Linksverschiebung, sagen wir, 48 oder binär 110000, es ist das gleiche wie mit 16 links Verschiebung oder alternativ ‚x << n‘ ist die gleiche wie ‚x << (n % 32)‘.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top