Newsgroup: it.comp.lang.c++
Titolo: Dubbio su conversioni di tipo

Se scrivo molto banalmente
short int a;
short int b;
.....
a=b+1;
il compilatore mi da il warning 
[C++Warning] xxx.cpp(58): Conversion may lose significant digits.
perchè evidentemente "1" per lui è un int e quindi prima promuove a
int b e poi deve "tagliare" a short nell'assegnamento...
Visto che il programma che sto scrivento, per motivi di
ottimizzazione, usa centinaia di variabili short su cui esegue
migliaia di calcoli, c'e' un modo per evitare di ritrovarmi ad ogni
compilazione una marea di warning?? In altre parole posso "convincere"
il compilatore a cosiderare "1" un short?? 
Il compilatore che sto usanso è il CBuilder 3
ciao
Andrea

 
Se usi CBuilder 3 deduco che sviluppi per Windows per CPU 386 o superiore.
In tal caso dubito molto che usare short invece di int possa ridurre il 
tempo di esecuzione (semmai riduce lo spazio di memoria utilizzato).
Essendo la CPU a 32 bit impiega lo stesso tempo ad operare su valori a 
16 e a 32 bit.
Inoltre lavorando a 16 bit c'č il problema del caricamento disallineato 
delle mezze-parole (che fa impiegare piů tempo).
Infine, correggetemi se sbaglio, una generica espressione in cui 
comparissero anche tutti 'short' come termini viene comunque valutata 
convertendoli tutti in 'int', eseguendo le operazioni e riconvertendo il 
risultato in 'short'.

 int b e poi deve "tagliare" a short nell'assegnamento...
Ho provato con il Visual C++ e non da questo tipo di warning. Probabilmente
è un po'  troppo zelante il tuo compilatore... :-)
Perchè non provi a fare una cosa del tipo:
                    a = b + short(1);
Dovresti forzare così a vedere 1 come short int anche se non credo sia il
massimo della pulizia e dell'eleganza e quindi mi vergogno un po' di questa
soluzione proposta...
Sini Andrea


provata ma non funge :-( 
penso che non sia possibile "castare" una kostante...
Andrea

> penso che non sia possibile "castare" una kostante...
Magari perche, IMHO, essendo *COSTANTE* non puo cambiare ne valore ne tipo.

risultato in 'short'.
infatti ciň che mi preoccupa di + č l'occupazione di memoria anche se
forse la mia paura deriva dal fatto che programmo ormai da un bel po'
di tempo ovvero quando il singolo kb di memoria poteva fare la
differenza...
 L'algoritmo che sto sviluppando utilizza alcune  struct con una
ventina di short int che poi vanno inserita alcune decine di migliaia
di volte su alcune list ecc ecc. 
In effetti passando da short a int su un pc moderno si avrebbe solo da
guadagnare.... ci penserň su ;-)
grazie e ciao
Andrea

 Magari perche, IMHO, essendo *COSTANTE* non puo cambiare ne valore ne
tipo.
int(1.2345) è permesso dal visual C++ e lo fa diventare 1

 16 e a 32 bit.
Da prove che avevo fatto io tempo fa, le prestazioni usando interi a 16 bit
al posto di interi a 32 bit addirittura calavano leggermente.
Da questo punto di vista paga di più usare gli unsigned e i signed, ad
esempio usare gli unsigned per divisioni, loop e array indexing e i signed
per le conversioni da intero a float (sitamo parlando sempre di processori
x86).
Se invece il motivo di usare gli short è dettato da motivi d'occupazione di
memoria, i motivi per farlo dovranno errere più che validi, altrimenti, non
ne vale la pena.

 int b e poi deve "tagliare" a short nell'assegnamento...
#define _ITS(a) ((short)a)
a = a + _ITS(1);
Ivan

 penso che non sia possibile "castare" una kostante...
Ma si che si puo'. Comunque puoi scrivere:
a = b + static_cast<short int>(1);
Ciao,
Nicola