Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219

    [teoria]compatibilità dei tipi in C

    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:
    codice:
    typedef struct
    {
        int a;
    }t1;
    
    typedef struct
    {
        int a;
        float r;
    }t2;
    t1 è compatibile con t2 ?

  2. #2
    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 che 9132454213215432125 viene arrotondato a 9132453970109792256.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3

    Re: [teoria]compatibilità dei tipi in C

    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/libr...(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.
    ;-)

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Tra un po', quando la GetTickCount64 sarà abbastanza usata al posto della precedente, quel tempo si allungherà ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.