In Java ist es möglich, eine ganze Zahl zu packen, die nicht negativ zu sein und endgültig (nicht Überlauf) in einen kurzen erwartet?

StackOverflow https://stackoverflow.com/questions/2520757

  •  22-09-2019
  •  | 
  •  

Frage

"unsigned int" in einen kurzen und zurück. Ist das möglich? Wie es zu tun, wenn so?

Grrrr. Ich habe vergessen, wie Zahlen mit Vorzeichen umgesetzt werden. Die Frage macht keinen Sinn. Danke trotzdem. Ich wollte mich downvote, können Sie es stattdessen tun können.

War es hilfreich?

Lösung

Ich bin nicht sicher, ob vollständig ich die Frage verstehen, aber wenn Sie sicher sind, dass Ihr int fit in eine kurzen (Sie Zahl zwischen 0 und 2 ^ 16) können Sie Ihren int auf einen kurzen immer Stimmen:

int i = 65536;
short s = (short) i;

Und den Wert ohne Vorzeichen zurück zu bekommen:     int i2 = s & 0xFFFF;     System.out.println (i2);

Die s & 0xFFFF wird s in einem int upCast und die Bitmaske wird „convert“ die negative Zahl ist es Wert ohne Vorzeichen (Art). Denken Sie daran, dass FFFF in einer kurzen Variable -1 nicht 65536.

Andere Tipps

Sounds wie Sie hoffen, für eine Basistyp, der die Arbeit für Sie tun, aber ich glaube nicht, ein solches vorhanden ist. Auf der anderen Seite, stelle ich mich es nicht zu schwierig sein würde, um ein Objekt zu erstellen, das die Arbeit erledigt. Bei Bedarf nachjustieren es kurz zu machen.

public class SpecialInt {
 int i = 0;

 public void set(int i) {
  if ( i < 0 ) throw new IllegalArgumentException("cannot be negative");
  this.i = i;
 }

 public void add(int j) {
  int t = i+j;
  if( t < i ) throw new IllegalArgumentException("overflow!");
  i = t;
 }

 public void sub(int j) {
  int t = i-j;
  if( t > i ) throw new IllegalArgumentException("overflow!");
  i = t;
 }

 public void mult(int j) {
  int mult_max = Integer.MAX_VALUE / i;
  if( j > mult_max ) throw new IllegalArgumentException("overflow!");
  i *= j;
 }
}

Wenn Sie Ihre ganze Zahl hat keine spezifische Eigenschaft wie ein Vielfaches von etwas, das glaube ich nicht möglich.

Das Problem ist, dass die Informationen in einen int enthalten ist, dass in der Regel 32-Bit-Architektur kann nicht in kurzer enthalten sein.

Wie Sie aus Short.MAX_VALUE tha Maximalwert sehen kann, ist 2 ^ 15-1, da eine kurze 16-Bit belegt .. so dass Sie tatsächlich verlieren Präzision und Sie keine ganzen Zahlen wie 2²² ausdrücken kann ..

Wenn Sie nicht signierte Typen wollen, können Sie die Javolution Bibliothek.

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