Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente bannato
    Registrato dal
    Sep 2012
    Messaggi
    465

    Perché il limite di un long a volte equivale a quello di un int?

    Perché questo programma non funziona ed Eclipse mi dice che è dovuto alla dimensione di num?

    codice:
    class Esempio {
    	  public static void main(String args[]) {
    		    long num;
    		    boolean isPrime;
    
    		    num = 2910965691; 
    
    		    if(num < 2) isPrime = false;
    		    else isPrime = true;
    
    		    for(long i=2; i <= num/i; i++) {
    		      if(num % i == 0) {
    		        isPrime = false;
    		        break;
    		      }
    		    }
    
    		    if(isPrime) System.out.println("Prime");
    		    else System.out.println("Not Prime");
    		  }
    	  }

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Perchè 2910965691 è una costante literal di tipo intero. Quel numero, per di più, non può essere rappresentato nel campo degli interi ed ecco che sorge il problema.
    Le costanti literal di tipo long devono essere seguite dalla lettera L (maiuscola o minuscola):

    codice:
    num = 2910965691L;
    Questa è corretta, poichè quella costante è di tipo long e non int.

    Stessa cosa per le costanti di tipo float: se si scrive il numero senza nulla, la costante literal è di tipo double. E' necessario aggiungere una F (maiuscola o minuscola) affinchè la costante sia di tipo float.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente bannato
    Registrato dal
    Sep 2012
    Messaggi
    465
    Pensavo che i numeri più grandi di int venissero promossi a long automaticamente come avviene per i byte e gli short...

    Grazie mille

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Originariamente inviato da peruzzo
    Pensavo che i numeri più grandi di int venissero promossi a long automaticamente come avviene per i byte e gli short...

    Grazie mille
    I valori vengono promossi automaticamente all'atto dell'assegnazione ad una variabile... ma ciò presuppone che il valore sia esistente. Se tale valore non è materializzabile, non vi può essere alcuna promozione.

    Se io assegno un valore intero ad una variabile di tipo long, c'è la promozione. Ma il valore intero iniziale deve poter essere creato in memoria. Tu hai specificato una costante (che, ripeto, scritta in quel modo è una costante intera, il tipo è dato dal modo in cui si scrive la costante), il cui valore non può essere creato perchè non ci sta dentro ad un intero.

    Non è facile spiegarlo, se non entrando nel capo dei domini e di come funziona l'allocazione delle costanti. Proviamoci cercando di semplicifare al massimo. Quando io scrivo questo codice:

    codice:
    long a = 25;
    Quello che accade è, grossomodo, questo:

    1) Viene allocata in memoria una costante intera e le viene assegnato il valore 25
    2) Viene allocata in memoria una variabile long
    3) Viene assegnato il valore della costante alla variabile long (e qui avviene la promozione)

    Nel tuo caso, hai questa cosa qua:
    codice:
    num = 2910965691;
    Che succede? Questo:

    1) Viene allocata in memoria una costante intera e le viene assegnato il valore 2910965691 (e qui casca subito il palco: quella costante non può contenere il valore da te scritto).
    2) Il compilatore s'arrabbia e ti dice che non puoi fare quella roba là.

    E' per questo che sono necessari i suffissi (L per i long, F per i float). Servono a scrivere delle costanti di quel tipo specifico. Senza il suffisso L, la costante sarebbe intera.

    Spero di averti chiarificato un po' meglio la questione.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Utente bannato
    Registrato dal
    Sep 2012
    Messaggi
    465
    Si si è chiarissimo e anche semplice, d'ora in poi non avrò più problemi di questo tipo però credo che qui Java si dovrebbe aggiornare perché se scrivo:

    codice:
    long variabile = COSTANTE;
    e costante non è un intero è banale capire che io sto assegnando a variabile un intero di tipo long. Detto questo la colpa è mia perché sul manuale si parlava di questa cosa ma non riuscivo più a ricordare in quanto avevo letto velocemente e non avevo più avuto modo di usare i long in altri codici di esempio.

    Grazie ancora

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Originariamente inviato da peruzzo
    Si si è chiarissimo e anche semplice, d'ora in poi non avrò più problemi di questo tipo però credo che qui Java si dovrebbe aggiornare perché se scrivo:

    codice:
    long variabile = COSTANTE;
    e costante non è un intero è banale capire che io sto assegnando a variabile un intero di tipo long. Detto questo la colpa è mia perché sul manuale si parlava di questa cosa ma non riuscivo più a ricordare in quanto avevo letto velocemente e non avevo più avuto modo di usare i long in altri codici di esempio.

    Grazie ancora
    Non è Java che si deve aggiornare, è il programmatore che deve scrivere giusto (fa parte della sintassi del linguaggio). Non è che se io scrivo "gor" Java deve aggiornarsi perchè è chiaro che volevo scrivere "for"

    E poi, quel numero che tu hai scritto non ci sta in un intero... bene, dove lo deve mettere? In una costante di tipo long o una costante double? Entrambe sono in grado di contenerlo...

    C'è una sintassi con cui si scrivono le costanti intere e c'è una sintassi con cui si scrivono le costanti long.

    Ed il fatto che per te sia banale, non significa che lo sia anche nella grammatica del linguaggio, né tantomeno per il compilatore (in fin dei conti, sei tu che gli stai dicendo che vuoi una costante intero... che ne sa lui che non volessi effettivamente un intero e, magari, hai semplicemente sbagliato a digitare?)


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    Utente bannato
    Registrato dal
    Sep 2012
    Messaggi
    465
    Originariamente inviato da LeleFT E poi, quel numero che tu hai scritto non ci sta in un intero... bene, dove lo deve mettere? In una costante di tipo long o una costante double? Entrambe sono in grado di contenerlo...
    In una di tipo long perché è quella più vicina, se non bastasse quella a 64 bit. In questo modo sarebbe tutto molto più chiaro e semplice, ovviamente è solo una mia idea ed è giusto adeguarsi. Ciò non toglie che Java non sia come la teoria dei numeri primi sopra vista ed io possa esprimere i miei giudizi sulla sintassi utilizzata. Forse la ragione è prettamente tecnica, il mio sistema di salvataggio renderebbe il linguaggio più versatile ma più lento a causa dell'analisi sulla costante. Mi adeguo, probabilmente c'è una motivazione ma di certo non vedo la cosa intuitiva ne tanto meno comoda.

    e grazie ancora

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Originariamente inviato da peruzzo
    In una di tipo long perché è quella più vicina, se non bastasse quella a 64 bit. In questo modo sarebbe tutto molto più chiaro e semplice, ovviamente è solo una mia idea ed è giusto adeguarsi. Ciò non toglie che Java non sia come la teoria dei numeri primi sopra vista ed io possa esprimere i miei giudizi sulla sintassi utilizzata. Forse la ragione è prettamente tecnica, il mio sistema di salvataggio renderebbe il linguaggio più versatile ma più lento a causa dell'analisi sulla costante. Mi adeguo, probabilmente c'è una motivazione ma di certo non vedo la cosa intuitiva ne tanto meno comoda.

    e grazie ancora
    Credo che capirai meglio il perchè una cosa del genere non sia fattibile, quando studierai la teoria dei linguaggi e/o i compilatori. L'unico modo per poter fare una cosa del genenere è avere un linguaggio poco tipizzato, con tutte le rogne che ne conseguono. Come già detto, quella cosa è sbagliata perchè, concettualmente, stai cercando di usare una costante di un tipo come se fosse di un altro tipo.
    Se un linguaggio permettesse qualcosa del genere, come si potrebbe sapere se c'è un errore di sintassi commesso dal programmatore (è facile aggiungere per sbaglio uno zero in coda e oltrepassare il limite di una variabile intera)? Il programma potrebbe dare valori assolutamente inaspettati perchè sarebbe "formalmente corretto" anche quando logicamente errato. Non funziona così. E per fortuna!

    Fidati: qui non si tratta ti "comodità", qui si tratta solo e semplicemente di sintassi.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.