Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Overflow: perchè?

Nella guida VB leggo la seguente descrizione dell'errore di overflow:
Overflow (errore 6)
........
Si è cercato di utilizzare un numero in un calcolo e si è impostato
forzatamente il tipo Integer per tale numero, ma il risultato è più grande
di un valore Integer. Ad esempio:
    Dim x As Long
    x = 2000 * 365   ' Errore: overflow
Per risolvere il problema, digitare il numero nel seguente modo:
    Dim x As Long
    x = CLng(2000) * 365
.......
Qual'è la ragione per cui viene assunto a priori che il risultato deve
essere "integer"?
Pensavo che il tipo assunto potesse essere determinato dal numero maggiore
tra quelli presenti, ma "x = 200 * 36" non dà errore (pure essendo il
prodotto di due "possibili" valori "byte") proprio perchè il risultato
rientra nei limiti degli "integer"...
Grazie!

essere "integer"?
VB converte automaticamente i tipi di dato, occultando la realta' al
programmatore.
Considerando che l'Integer e' il tipo numerico predefinito per visual
basic, i passi che segue il compilatore sono infatti i seguenti:
1. mette 2000 in un integer;
2. mette 365 in un integer;
3. poiche' esegue un'operazione tra due Integer salva il risultato
automaticamente in una variabile implicita dello stesso tipo: Integer.
Questo avviene "prima" di assegnare il risultato alla variabile x che
hai dichiarato;
4. Boom: ecco l'overflow!
Nel secondo caso non si rompe nulla perche' l'operazione avviene tra
un Long ed un Integer, percio' visual basic "promuove" automaticamente
il 365 a Long e memorizza il risultato in una variabile di tipo Long,
prima di assegnare alla variabile x.
-- 
ciao, un hal di passaggio


wrote:

A questo aggiungo un "malvezzo" di noi programmatori che troppo spesso
ci fidiamo (e prendiamo delle bastonate).
In effetti dovremmo sempre indicare sui valori numerici che scriviamo:
% per interi (es 2000%)
& per long (es 2000&)
# per double (es 2000#)
! per single (es 2000!)
Ciau!
=======================================================================
Se mi vuoi scrivere togli le maiuscole
cteniza...@hotmail.com
=======================================================================

 & per long (es 2000&)
Questa sintassi è preferibile a CLng(2000) perchè 2000 viene compilato
direttamente come long e non viene convertito ogni volta a runtime.
Ciao
-- 
NeoDataType : 
http://www.neodatatype.net
Sito Comune : 
http://www.it-lang-vb.net

 Ciao
Ancor piů preferibile, anzichč scrivere:
x = 2000 * 365 
scrivere
x= 730000  ':)
o ancora:
const duemilaPerTrecentosessantacinque as long = 730000
x=duemilaPerTrecentosessantacinque  ':) :)
termoPilucco
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 x=duemilaPerTrecentosessantacinque  ':) :)
Sì, ma così diventa lunga... per coerenza dovresti definire in un modulo
tutti i numeri dall'1 fino al 730000... :P


 modulo tutti i numeri dall'1 fino al 730000... :P
e scusa e quelli da 730000 a infinito ?
cercate su google :p
-- 
[Gigio2k]
http://www.g2kweb.it
[ it-alt.comp.hardware.modding ] - 
http://www.g2kweb.it/ichm

tutti i numeri dall'1 fino al 730000... :P
Sono già definite.
Il loro nome e 
1
2
3
4
.
.
.
730000
:)
termoPilucco