PDA

Visualizza la versione completa : [C] Compatibilità dei tipi in C


ramy89
27-12-2011, 12:47
Vi mostro la definizione nel caso non la sapete:
"Dati due tipi T ed S, si dice che T è compatibile con S se :
-T ed S sono equivalenti, oppure se:
-I valori di T sono un sottoinsieme dei valori di S;"

Quindi ad esempio il tipo int in C è compatibile col tipo float perchè i naturali sono un sottoinsieme dei reali.
Però non ho capito una cosa, se io ho questi due tipi:


typedef struct
{
int a;
}t1;

typedef struct
{
int a;
float r;
}t2;


t1 è compatibile con t2 ? :confused:

MItaly
27-12-2011, 12:58
Strettamente parlando, no, dato che gli interi non sono un sottoinsieme del prodotto cartesiano di interi e reali, ma sono proprio due oggetti matematici diversi. D'altra parte se identifichi gli interi con la coppia (intero, 0) (ovvero, crei una corrispondenza biunivoca tra Z e il prodotto cartesiano di Z con 0 tale da mandare i in (i, 0)) allora si può dire che quest'ultimo insieme è un sottoinsieme della seconda struct, per cui i due tipi sono compatibili.

Tieni comunque conto che bisogna sempre fare attenzione a fare discorsi matematici con tipi usati dal computer, visto che i float non sono i numeri reali (hanno mantissa ed esponente limitata), e gli int non sono gli interi relativi (sono solo un loro sottoinsieme limitato).

Per questo motivo, se ad esempio consideriamo int a 64 bit e float a 32 bit, int e float non sono compatibili, dato che molti numeri che stanno tranquillamente in un int a 64 bit non possono essere rappresentati in maniera esatta da un float (che necessariamente arrotonderà, dato che ha solo 24 bit di mantissa). Vedi ad esempio qui (http://ideone.com/2tMr6) che 9132454213215432125 viene arrotondato a 9132453970109792256.

MacApp
28-12-2011, 00:52
Non commettere l'errore di assimilare i tipi int (short/long signed od unsigned che siano) con gli insiemi dei Naturali o degli Interi.

Ad esempio:
In C/C++ "n+1" può essere minore di "n".

Ed è il principale motivo per cui i programmi (fatti male) in ambiente windows, in genere non reggono oltre i 50 giorni:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms724408(v=vs.85).aspx


GetTickCount

The elapsed time is stored as a DWORD value. Therefore, the time will wrap around to zero if the system is run continuously for 49.7 days.

;-)

oregon
28-12-2011, 08:25
Tra un po', quando la GetTickCount64 sarà abbastanza usata al posto della precedente, quel tempo si allungherà ...

Loading