Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [C] Limiti massimi e minimi dei tipi C.

    Salve a tutti,
    spiego brevemente il problema pratico a cui mi trovo costretto a trovare una soluzione.
    Scrivo codice utilizzante i tipi C99/Posix, quelli definiti nell'header stdint.h.
    Questi tipi sono exact width, cioè danno la sicurezza certa che un tipo di 8 bit di length non è nè più corto nè più lungo.
    Sto cercando di gestire tramite preprocessore del C la situazione in cui questo header non sia presente, in questo caso faccio dei typedef con i tipi normali per rendere comunque compilabile il codice.
    Il problema si pone quando voglio valutare se il tipo standard del C in quell'implementazione ha limiti massimi e minimi "accettabili" per contenere i valori.
    Lo standard dice che un plain/signed/unsigned char è lungo ALMENO 8 bit, che un signed/unsigned short int è lungo ALMENO 16 bit e che un signed/unsigned long int è lungo almeno 32 bit.
    Facendomi forte di questa "sicurezza" pensavo di impostare i limiti manualmente con dei #define, pensando che un char lungo ad esempio 9 bit potesse comunque contenere gli 8 bit necessari al mio codice e che quindi il limite massimo fosse (2 elevato all'8) - 1 e cioè 0xFF.
    Mi è però stato detto che la lunghezza di un dato non assicura il limite massimo e minimo, cioè che è possibile avere un compilatore che utilizzi per un tipo char una lunghezza di 32 bit e un limite massimo inferiore a 0xFF.
    Esiste un limite massimo e minimo definito dallo standard (un po' come la lunghezza di ALMENO 8, 16 o 32 bit)?
    Potreste aiutarmi a porre rimedio a questo problema/dubbio?

    Ringraziando tutti per l'attenzione, porgo distinti saluti.

  2. #2
    Scusate, il mio thread è forse di così scarso interesse tecnico da non ricevere nemmeno un commento/risposta?
    Il problema, se non si fosse capito o non mi fossi spiegato bene, non è quello di fare un #include <limits.h>.

    Saluti.

  3. #3
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Da quel che leggo, lo standard prevede che i vari tipi fondamentali debbano essere grandi a sufficienza per contenere il loro intervallo MAX e MIN definito in limits.h, il che mi fa pensare che questi valori siano platform/compiler dependent.
    Però non ho trovato traccia di una definizione precisa di quanto debbano essere questi vari MAX e MIN (almeno nella bozza di C++0x che ho sottomano).
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  4. #4
    ma limits.h non è uguale per tutte le piattaforme (definisco piattaforma l'insieme architettura hardware + OS + compiler), pensavo che, sapendo quanti bit avesse un tipo, si potesse ricostruire il suo limite massimo, ad esempio per un unsigned, in questo formato
    (2 ^ numero di bit del tipo) - 1.
    Però ci sono incertezze sull'uso di tutti i bit del tipo per memorizzare valori.

  5. #5
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Penso che l'approccio sia più pragmatico che teorico. Cioè che in base alla dimensione dei registri della CPU e dell'unità mimimi, prima si stabiliscano la dimensione dei vari tipi e poi stabiliscano i valori massimi e minimi necessari per singolo tipo in base a criteri di retrocompatibilità.
    In fondo i tipi base reali del C e C++ sono due: interi e virgola mobile. I vari char, short int etc, sono solo riduzioni di un int.
    Se un particolare compilatore su un particolare processore vuole usare 32bit per un char, può farlo, purché quel tipo sia adatto a contenere (cit.) "ogni elemento del set di caratteri base dell'implementazione".
    Un esempio è il tipo wchar_t: in Windows è a 16 bit, in Unix/Linux è a 32bit.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  6. #6
    Originariamente inviato da shodan
    Penso che l'approccio sia più pragmatico che teorico. Cioè che in base alla dimensione dei registri della CPU e dell'unità mimimi, prima si stabiliscano la dimensione dei vari tipi e poi stabiliscano i valori massimi e minimi necessari per singolo tipo in base a criteri di retrocompatibilità.
    Penso che i registri del processore dicano ben poco.
    Ad esempio, su una CPU con architettura IA32 (utilizzante quindi registri di general purpose, di segmento e di offset per un width massimo di 32 bit), con un OS a 32 bit si può utilizzare comunque il tipo C99 signed/unsigned long long int o int64_t/uint64_t che ha un width di 64 bit.
    Alcuni compilers adottano infatti metodi propri per utilizzare tipi più grandi del limite massimo dei registri della CPU.

    Originariamente inviato da shodan
    In fondo i tipi base reali del C e C++ sono due: interi e virgola mobile. I vari char, short int etc, sono solo riduzioni di un int.
    Se un particolare compilatore su un particolare processore vuole usare 32bit per un char, può farlo, purché quel tipo sia adatto a contenere (cit.) "ogni elemento del set di caratteri base dell'implementazione".
    Un esempio è il tipo wchar_t: in Windows è a 16 bit, in Unix/Linux è a 32bit.
    Il discorso del tipo wchar_t dipende dall'implementazione di Unicode presente nell'OS:
    Microsoft Windows utilizza UTF16 mentre MAC OS X e Linux utilizzano UTF32, quindi è un discorso prettamente legato all'OS.

    Comunque non sono ancora riuscito a capire se, pur avendo un char di 32 bit, è sicuro che quel char abbia come limite minimo -128 (in notazione a complemento a 2) e come limite massimo 127, o meglio se questi due valori siano comunque compresi all'interno del suo range e non ci sia il caso in cui abbia limite minimo > -128 e limite massimo < 127.
    Ci fosse questo caso avrei problemi nei software in cui è importante che non si verifichino troncamenti

  7. #7
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Originariamente inviato da italian_coder
    Alcuni compilers adottano infatti metodi propri per utilizzare tipi più grandi del limite massimo dei registri della CPU.
    Il discorso dei registri era per evidenziare che la CPU, di per se, non ha il concetto di tipo dato del C. Che poi il compilatore adotti trucchi suoi per usare più di un registro, non fa che evidenziare il "platform dependent".

    Il discorso del tipo wchar_t dipende dall'implementazione di Unicode presente nell'OS:
    Microsoft Windows utilizza UTF16 mentre MAC OS X e Linux utilizzano UTF32, quindi è un discorso prettamente legato all'OS.
    Quindi siamo sempre sul platform dependent.

    Comunque non sono ancora riuscito a capire se, pur avendo un char di 32 bit, è sicuro che quel char abbia come limite minimo -128 (in notazione a complemento a 2) e come limite massimo 127, o meglio se questi due valori siano comunque compresi all'interno del suo range e non ci sia il caso in cui abbia limite minimo > -128 e limite massimo < 127.
    Ci fosse questo caso avrei problemi nei software in cui è importante che non si verifichino troncamenti
    Leggi qui: è per il C++, ma per il C dovrebbe essere uguale.
    http://www.parashift.com/c++-faq-lit....html#faq-29.5
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.