2015-09-29 24 views
6

devo cercare di convertire il codice in Java per rapida 2,0Come convertire un long in int in Java vs. swift?

long checksumValue = 4253726258L; 
int liCrc32 = (int)checksumValue; 
System.out.println("liCrc32" + liCrc32) 

LiCrc32 è uguale a -41241038

mio rapida versione

let int64: Int64 = 4253726258 
let a:Int = Int(int64) 

a me ritorna 4253726258

Cosa non capisco perché in Java il valore è negativo?

+0

il numero è troppo grande per entrare in un java '' int'' . Perché lo lanci a '' int''? Usa '' long'' fino in fondo. – f1sh

+0

Tks. Lo farò! – Bolo

risposta

3

Si sta utilizzando un tipo sbagliato: Swift della Int non corrisponde necessariamente Java int, perché le sue dimensioni sono specifiche della piattaforma. A giudicare dal tuo output, la tua piattaforma utilizza 642 bit Int s. Ecco come confermare questo:

println(sizeof(Int)) // Should print 8 on your platform 

Int32 partite Java int. Sfortunatamente, questo cambiamento

let int64: Int64 = 4253726258 
let a:Int32 = Int32(int64) 

può causare problemi a causa di un bug nell'implementazione di Swift.

Se è necessario registrarsi estendere un valore a 32 bit, si può fare in questo modo:

let int64: Int64 = 4253726258 
let a:Int = Int((int64 << 32) >> 32) 
println(a) // prints -41241038 

Demo.

+0

Sono curioso: di quale * bug * stai parlando? - 'let a = Int32 (truncatingBitPattern: int64)' dovrebbe funzionare correttamente in ogni caso. –

+0

@MartinR Ho incollato lo snippet di codice a due righe in [http://www.runswiftlang.com/](http://www.runswiftlang.com/), e ho avuto un crash con un'istruzione non valida: '94909 Istruzione non valida : 4' Ho ottenuto lo stesso risultato incollando il codice su [http://swiftstub.com/](http://swiftstub.com/), tranne che "mascherano" l'errore con un messaggio che pensano sia divertente (non lo fa). – dasblinkenlight

+0

Non penso che sia un bug. Il costruttore 'Int32 (_ v: Int64)' non tronca implicitamente (e interrompe nel caso di un overflow), al contrario di 'Int32 (truncatingBitPattern v: Int64)'. –

4

Dal Swift documentation

Int

Nella maggior parte dei casi, non è necessario scegliere una dimensione specifica di numero intero a uso nel codice. Swift fornisce un ulteriore tipo intero, Int, che ha la stessa dimensione come dimensione della parola nativa della piattaforma corrente:

  • Su una piattaforma a 32 bit, Int è la stessa dimensione Int32.

  • Su una piattaforma a 64 bit, Int ha la stessa dimensione di Int64.

A meno che non hai bisogno di lavorare con una dimensione specifica di integer, utilizzare sempre Int per valori interi nel codice. Questo aiuta la consistenza del codice e l'interoperabilità . Anche su piattaforme a 32 bit, Int può memorizzare qualsiasi valore tra -2,147,483,648 e 2.147.483.647 ed è sufficientemente grande per molti intervalli di numeri interi.

Java's int, on the other hand, is always 4 bytes.

I tipi integrali sono byte, short, int e long, i cui valori sono 8-bit, 16 bit, 32 bit e 64 bit con segno interi a due complementi, rispettivamente , [...]

Casting da un long a un int provoca un narrowing primitive conversion

Un ambito conversione primitivo può perdere informazioni sul grandezza globale di un valore numerico e può anche perdere precisione e gamma.

+0

Questa risposta è molto utile – Leo

2

int: Per default, il tipo di dati int è un 32 bit firmato due di numero intero complemento, che ha un valore minimo di -231 e un valore massimo di 231-1. In Java SE 8 e versioni successive, è possibile utilizzare il tipo di dati int per rappresentare un numero intero a 32 bit senza segno, che ha un valore minimo di 0 e un valore massimo di 232-1. Utilizzare la classe Integer per utilizzare i dati int come un numero intero senza segno. Vedi la sezione Le classi numeriche per ulteriori informazioni. Metodi statici come compare Unsigned, divideUnsigned ecc. Sono stati aggiunti alla classe Integer per supportare le operazioni aritmetiche per interi senza segno.

long: Il tipo di dati lunghi è un numero intero a 64 bit di un complemento. Il long firmato ha un valore minimo di -263 e un valore massimo di 263-1. In Java SE 8 e versioni successive, è possibile utilizzare il tipo di dati lunghi per rappresentare una lunghezza a 64 bit senza firma , che ha un valore minimo di 0 e un valore massimo di di 264-1. Utilizzare questo tipo di dati quando è necessario un intervallo di valori più ampio di quelli forniti da int. La classe Long contiene anche i metodi come compare Unsigned, divideUnsigned ecc. Per supportare operazioni aritmetiche per unsigned long.

Il che significa che un int in Java < J8 può essere massima:

2.147.483.647 

che è più piccolo di quanto il tuo int: 4.253.726.258

Perciò non si può stare in una int, si sia è necessario attenersi a long oppure aggiornare Java alla versione 8 e creare un int unsigned.

Cosa succede con la conversione è che dopo 2.147.483.647, il conteggio continua a partire dal minimo numero di (-2.147.483.647) e, infine, dando -41241038 che è -2.147.483.647+ (4.253.726.258 - 2.147.483.647)