Stavo cercando di rintracciare un comportamento molto strano di Java. Ho una formula che comporta un doppio, ma è "garantita" per dare una risposta intera - in particolare, un numero intero a 32 bit senza segno (che, purtroppo, Java non funziona bene). Sfortunatamente, le mie risposte erano a volte errate.I cast primitivi di tipo intero Java sono "limitati" al MAX_INT del tipo di trasmissione?
Alla fine ho trovato il problema, ma il comportamento è ancora molto strano per me: un double
getto direttamente ad un int
sembra essere limitato alla MAX_INT
per un intero con segno, mentre un cast double
ad un long
che è quindi il cast in un int
mi dà la risposta attesa (-1; il MAX INT di un numero intero a 32 bit senza segno rappresentato come un intero con segno a 32 bit).
ho scritto un piccolo programma di test:
public static void main(String[] args) {
// This is the Max Int for a 32-bit unsigned integer
double maxUIntAsDouble = 4294967295.00;
long maxUintFromDoubleAsLong = (long)maxUIntAsDouble;
long maxUintFromDoubleAsInt = (int)maxUIntAsDouble;
int formulaTest = (int) (maxUintFromDoubleAsLong * 1.0);
int testFormulaeWithDoubleCast = (int)((long) (maxUintFromDoubleAsLong * 1.0));
// This is a more-or-less random "big number"
long longUnderTest = 4123456789L;
// Max int for a 32-bit unsigned integer
long longUnderTest2 = 4294967295L;
int intFromLong = (int) longUnderTest;
int intFromLong2 = (int) longUnderTest2;
System.out.println("Long is: " + longUnderTest);
System.out.println("Translated to Int is:" + intFromLong);
System.out.println("Long 2 is: " + longUnderTest2);
System.out.println("Translated to Int is:" + intFromLong2);
System.out.println("Max UInt as Double: " + maxUIntAsDouble);
System.out.println("Max UInt from Double to Long: " + maxUintFromDoubleAsLong);
System.out.println("Max UInt from Double to Int: " + maxUintFromDoubleAsInt);
System.out.println("Formula test: " + formulaTest);
System.out.println("Formula Test with Double Cast: " + testFormulaeWithDoubleCast);
}
Quando ho eseguito questo piccolo programma ottengo:
Long is: 4123456789
Translated to Int is:-171510507
Long 2 is: 4294967295
Translated to Int is:-1
Max UInt as Double: 4.294967295E9
Max UInt from Double to Long: 4294967295
Max UInt from Double to Int: 2147483647
// MAX INT for an unsigned int
Formula test: 2147483647
// Binary: all 1s, which is what I expected
Formula Test with Double Cast: -1
Le due linee di fondo sono quelli che sto cercando di capire. Il doppio cast mi dà il previsto "-1"; ma il cast diretto mi dà MAX_INT per un intero con segno a 32 bit. Venendo da uno sfondo C++, capirei se mi dava un "numero dispari" invece del previsto -1 (ovvero "ingenuo casting"), ma questo mi lascia perplesso.
Così, alla domanda, allora: è questo comportamento "previsto" in Java (per esempio ogni double
getto direttamente a un int
sarà "limitato" per MAX_INT
)? Il cast esegue questo per qualsiasi tipo imprevisto? Mi aspetto che sia simile per short
e byte
, per esempio; ma qual è il "comportamento previsto" quando si esegue il casting di un oversize-double?
Grazie!
Sapevo della mancanza di "unsigned" in java (una delle cose che rende Java un tale problema quando si lavora con i protocolli bit-oriented), ma la maggior parte del resto è nuova di zecca. Sicuramente non mi aspettavo questo comportamento da "short" e "byte". Grazie. : D –