OverFlow tra due integer



  • OverFlow tra due integer
    di pregiudicato_83 (utente non iscritto) data: 22/11/2016 16:17:42

    Ciao, avrei bisogno urgentemente di un aiutino:

    qualcuno sa dirmi perchè questo codice mi va in overflow?
    grazie a tutti
     
    Dim PIPPO1 As Integer
    Dim PIPPO2 As Integer
    
    PIPPO1 = 100
    PIPPO2 = 470
    RISULTATO = (PIPPO2 * PIPPO2) / 5000



  • di Mister_x (utente non iscritto) data: 22/11/2016 17:25:12

    ciao

    stai usando windows10 a 32 o 64 bit
    integer 16 bit

    quindi dichiara dora in poi long 32bit

    ciao


     
    Dim PIPPO1 As long
    Dim PIPPO2 As long
    dim Risultato as long
    PIPPO1 = 100
    PIPPO2 = 470
    RISULTATO = (PIPPO2 * PIPPO2) / 5000
    






  • di Albatros54 data: 22/11/2016 17:25:18

    dichiare le variabili come long





  • di alfrimpa data: 22/11/2016 17:29:10

    Gioacchino io l'ho fatto ma va ugualmente in overflow

    Alfredo





  • di Albatros54 data: 22/11/2016 17:40:15

    strano, ho win 7 a 64 Bit ed excel 2007 ,e il tutto funziona
    Gioacchino





  • di Mister_x (utente non iscritto) data: 22/11/2016 17:57:16

    ciao

    Integer
    Le variabili di tipo Integer sono memorizzate come numeri a 16 bit (2 byte) compresi nell'intervallo fra -32.768 e 32.767.
    RISULTATO = (PIPPO2 * PIPPO2) / 5000
    nel nostro caso 470*470 = 220900 quindi e' un long

    se abbiamo una variabile long in questo caso funziona
    Dim PIPPO1 As Long
    Dim PIPPO2 As Integer
    PIPPO1 = 470
    PIPPO2 = 470
    RISULTATO = (PIPPO2 * PIPPO1) / 5000
    Le variabili di tipo Long (a intero lungo) sono memorizzate come numeri con segno a 32 bit (4 byte) compresi nell'intervallo fra -2.147.483.648 e 2.147.483.647.

    ciao





  • di pregiudicato_83 (utente non iscritto) data: 22/11/2016 18:09:25

    Ciao, grazie per le risposte.
    PIPPO1 e PIPPO2 sono integer e non hanno mai un valore oltre i 32000 (circa)
    anche RISULTATO non va mai oltre il valore di 32000 (anche se RISULTATO non è un integer quindi potrebbe benissimo).
    se giro la formula in questo modo funziona tutto.

    grazie
     
    Dim PIPPO1 As Integer
    Dim PIPPO2 As Integer
    
    PIPPO1 = 100
    PIPPO2 = 470
    RISULTATO = (PIPPO2 / 5000 * PIPPO1) 
    



  • di Alessandro (utente non iscritto) data: 22/11/2016 19:25:01

    Ciao prova a fare la variabile in ( String ) poi vedi cosa succede , a differenza che ti mette i centesimi



  • di scossa data: 22/11/2016 19:27:34

    cit.: "anche RISULTATO non va mai oltre il valore di 32000 (anche se RISULTATO non è un integer quindi potrebbe benissimo)."

    Risultato puoi anche dichiararlo Integer, non è li il problema.
    Il punto è che PIPPO1 * PIPPO2 (entrambi dichiarati integer) viene valutato come Integer e quindi va in overflow, mentre

    RISULTATO = CLng(PIPPO2) * CLng(PIPPO2) / 5000

    funziona anche con RISULTATO dichiarato as Integer.


    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)




  • di Alessandro (utente non iscritto) data: 22/11/2016 19:31:42

    Ciao prova così a volte non si sa mai hai comunque come risultato i centesimi a volte può succedere che va in over perchè non è un divisibile
     
    Dim PIPPO1 As String
    Dim PIPPO2 As String
    Dim Risultato As String
    PIPPO1 = 100
    PIPPO2 = 470
    Risultato = (PIPPO2 * PIPPO2) / 5000
    Cells(1, 1) = Risultato



  • di pregiudicato_83 (utente non iscritto) data: 22/11/2016 19:42:03

    Grazie Scossa, so che quando arrivi tu la soluzione è vicina...
    lo avevo intuito anche io, quello che non capisco è perché?
    nel senso che PIPPO1 * PIPPO2 va oltre 32000, ma non viene assegnato a nessuna variabile (fa parte momentaneamente della formula).
    e poi la formula intera riabbassa il valore dividendo per 5000.

    ho fatto delle prove e anche questo codice ha gli stessi problemi..


     
    Private Sub CommandButton2_Click()
    Dim pippo As Integer
        pippo = 5000 / 10000 * 5000 'funziona
        pippo = 5000 * 5000 / 10000 'non funziona
    End Sub



  • di scossa data: 22/11/2016 20:21:39

    cit.: "ma non viene assegnato a nessuna variabile (fa parte momentaneamente della formula)"

    Il fatto che non venga assegnato ad una variabile non significa che non venga riservato uno spazio di memoria dove "parcheggiare" il risultato, e poiché entrambe le variabili (Pippo1 e Pippo2) sono dichiarate Integer VBA riserva uno spazio per contenere un Integer.
    Basterebbe che una delle due Pippo fosse dichiarata as Long per avere una conversione implicita a Long anziché ad Integer.


    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee.
    (George Bernard Shaw)



  • di pregiudicato_83 (utente non iscritto) data: 22/11/2016 20:40:51

    ok grazie a tutti.
    ciao