PDA

Visualizza la versione completa : [c++ ] Dati ANSI, e conversione di tipo negli assegnamenti


asp.net=cfm=xml
19-05-2002, 13:52
Allora, stò studiando il c++, ma non sono ancora riuscito a capire un cosa. Vorrei cercare di aquisirla una volta per tutte:

1) si usano per definire le variabili, ma in che modo? che differenza c'è tra di loro?

- char
- unsigned char
- signed char
- int
- unsigned int
- signed int
- short int
- unsigned short int
- signed short int
- long int
- signed long int
- unsigned long int
- float
- double
- long double

so perfettamente quanto valgono [in bit], ma non so quando devo usare l'uno o l'altro per definire le variabili.

2) piccolo es:

int x;
char ch;
float f;

void func(void)
{
ch = x; // riga 1
x = f; // riga 2
f = ch; // riga 3
f = x; // riga 4
}

questo è l'esempio del mio libro, per spiegfare la conversione di tipo negli assegnamenti. Il problema è che non ho capito nulla di questo argomento.

Se qualcuno fosse così gentile da volermi aiutare....

r0x
19-05-2002, 14:25
Mi sa che sei di travertino... Ti ho scritto post dettagliatissimi su questa cosa e milioni di volte... BAH. :nonlodire

In linea di massima è a tua DISCREZIONE, non ci sono regole ferree (a parte la capienza della variabile, ma per iniziare non ti serve saperlo, fidati!!) che ti impongono di usare un tipo invece che un altro, almeno nell'ambito di tipi che hanno lo stesso uso (tipi interi, tipi con la virgola).

Cmq il modificatore 'signed' è sottinteso, quindi ti elenco alcuni sinonimi:

char = signed char
short int = signed short int
long int = signed long int
int = signed int

signed short int = signed short = short
signed long int = signed long = signed (in generale)
signed int = signed long int (in generale)

unsigned short int = unsigned short
unsigned long int = unsigned long = unsigned (in generale)
unsigned int = unsigned long int (in generale)

In ogni caso, non è assolutamente IMPORTANTE capire quando sia meglio usare che so... 'char' invece di 'int', o 'float' invece di 'double'. FREGATENE! Passa avanti, e per ora usa:

- 'char' per i caratteri e per le stringhe;
- 'int' per i numeri interi;
- 'double' per i numeri con virgola.

Per il momento non ti interessa sapere in dettaglio tutto su ogni tipo, quindi cambia argomento, altrimenti non ti muovi più e accanni tutto. E' un consiglio da uno che ci è passato, abbi fede! :quipy:

P.S.: rivediti anche la risposta che ti ho dato sul topic "const e volatile".

Ciao.

asp.net=cfm=xml
19-05-2002, 16:39
ok, ho capto, ma potresti spiegarmi la conversione di tipo negli assegnamenti, realtiva al mio esempio?

r0x
19-05-2002, 19:00
Le conversioni "forzate" in C/C++ prendono il nome di cast. Nelle righe che hai postato probabilmente il compilatore ti darà dei warnings perché i cast non sono stati espressi esplicitamente.



ch = x; // se x è un valore fra -128 e 127 (compresi), ch memorizza il valore giusto di x; in caso contrario, ne memorizza il byte basso, con conseguente perdita di informazioni sul dato

x = 100;
ch = x; // nessun problema

x = -40;
ch = x; // nessun problema

x = 65535; // uso questo numero perché è più facile da convertire
ch = x; // il numero è troppo grande per stare in un char; 65535 = 0x0000FFFF (esadecimale, considero l'int a 32-bit, 4 bytes = 4 char), in ch viene memorizzato il byte più basso, che in questo caso vale 0xFF, cioè 255




x = f; // non ricordo bene come i float memorizzano il proprio valore, ma siccome spesso contengono numeri con la virgola, un cast da float a int porta la perdita della parte decimale

f = 10;
x = f; // nessun problema

f = 10.345;
x = f; // x memorizza solo 10


La terza riga non causa perdite, perché float è sicuramente più grande di char; per la quarta non sono sicuro, ma in linea di massima vale lo stesso discorso.

In generale devi solo sapere (ed è una cosa ovvia) che le perdite di dati possono accadere solo se si passa da un tipo grande ad un tipo più piccolo.

Puntiglioso? Sì, forse giusto un po'! :tongue:

Ciao.

asp.net=cfm=xml
19-05-2002, 19:24
allora, devo darti atto di una grande maestria nella programmazionee [il tuo secondo nome sarà mica azzecca garbugli...? :gren:]. Cmq, in pratica:

se converto valori piccoli con valori grandi non succede nulla, ma non è vero il contrario. Ora, l'unico problema è: quali sono i valori piccoli e quelli grandi? [intendo: int, char, float, double].

Loading