Ho provato questa conversione int e long dove ho provato ad assegnare una variabile int
a una variabile long
. Il codice è il seguente:int to long assignment
public static void main(String []args){
int i = 1024;
long j = i;
long k = i*i*i*i;
System.out.println("j= " +j+ ", k= " +k);
}
Così, durante la stampa j
, semplicemente ha dato una potenza di 1024
. Ma durante la stampa di k
, ha mostrato un overflow (k
= 0). Ho risolto questo problema utilizzando questa tecnica, dove ho espressamente castato ogni i
a long
. cioè
public static void main(String []args){
int i = 1024;
long j = i;
long k = ((long)i)*((long)i)*((long)i)*((long)i);
System.out.println("j= " +j+ ", k= " +k);
}
Ora, mostravano valori corretti sia j
e k
. Quindi, volevo sapere perché è necessario trasmettere int
nel secondo caso ma non nel primo. k
, essendo un long
può mantenere questo valore dopo questa pesante assegnazione. Ma perché non è stato assegnato correttamente?
il primo casting 'i' a long dovrebbe essere sufficiente –
((long) i) * i * i * i –
Il pattern difettoso che hai identificato - una moltiplicazione di numeri interi che potrebbero traboccare che viene convertita" troppo tardi "in un tipo più grande - è relativamente comune sia in C# che in Java; troviamo più di cinque istanze per milione di righe di codice analizzate. Un difetto correlato con un tasso di scoperta simile è una divisione di due interi e una conversione "troppo tardi" in un doppio; la gente è spesso sorpresa che trecento divisi per cinquecento e assegnati a un doppio sia zero, non 0,6. –