Visualizzazione dei risultati da 1 a 5 su 5

Discussione: Tipi di dati C

  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2014
    Messaggi
    3

    Tipi di dati C

    Salve,
    con il seguente programmino visualizzo il numero di bit per rappresentare i vari tipi di dati.
    Mi risulta come è giusto che un intero è rappresentabile con 32 bit, cioè può assumere i seguenti valori: -32768 ÷ 32.767. Tuttavia se provo a definire e visualizzare una varibile int a=33000, non segna nessun errore ... ma 33000 è superiore al valore massimo che dovrebbe essere possibile definire ... lo stesso succede con a=-33000.


    Qualcuno mi sa spiegare il perchè?
    Grazie mille



    #include <stdio.h>


    main()
    {
    int num_bit;


    num_bit = sizeof ( char ) * 8;
    printf ("\n Su questa macchina un char e' su %d bit", num_bit);
    printf ("\n un intero su %d bit", (sizeof (int) * 8));
    printf ("\n un float su %d bit", (sizeof (float) * 8));
    printf ("\n un double su %d bit\n", (sizeof (double) * 8));


    system("PAUSE");
    }

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Veramente quei limiti sono per i 16 bit non per i 32 ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it L'avatar di escocat
    Registrato dal
    Feb 2012
    Messaggi
    308
    Se fai 1+2+4+8+16+32+64+128+... per 32 volte a quanto arrivi?

  4. #4
    Incidentalmente, anche con int a 16 bit la prova che hai fatto non è indicativa di nulla, dato che in C l'overflow non dà necessariamente errore... Per gli interi senza segno è garantito l'overflow con wraparound (65535+1 => 0), per quelli con segno è undefined behavior (anche se spesso si ottiene wraparaound in complemento a due).
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Le costanti architetturali, in linguaggio C, sono esplicitate in appositi header: in particolare limits.h e float.h. Dopo il 1999 (con la promulgazione del nuovo standard, ultimo del millennio scorso), quasi tutti i compilatori mainstream supportano anche header aggiuntivi come stdint.h e inttypes.h, come ho dettagliatamente spiegato qui.

    Circolano in letteratura innumerevoli esempi in merito, e io stesso negli anni ne ho implementati al volo numerosi, in varie salse, disseminati in svariati forum. Uno degli esempi più didattici e semplificati può essere il seguente:

    codice:
    #include <stdio.h>
    #include <limits.h>
    #include <float.h>
    
    #if defined(__ICC) || defined(__INTEL_COMPILER)
        const char Compiler[] = "** Compiled with Intel C/C++"
                                "                              **";
    #endif
    #if defined(__TURBOC__) || defined(__BORLANDC__)
        const char Compiler[] = "** Compiled with Borland C++"
                                "                              **";
    #endif
    #if defined(_MSC_VER)
        const char Compiler[] = "** Compiled with Visual C/C++"
                                "                             **";
    #endif
    #if defined(__DMC__)
     #include <inttypes.h>
     #define _UI64_MAX ULLONG_MAX
        const char Compiler[] = "** Compiled with Digital Mars"
                                "                             **";
    
    #endif
    #if defined(__WATCOMC__)
     #include <inttypes.h>
        const char Compiler[] = "** Compiled with Open Watcom"
                                "                              **";
    #endif
    
    #define H_SEP_STAR "************************************************************"
    #define H_SEP_LINE "------------------------------------------------------------"
    
    #if !defined(PRIu64)
     #define PRIu64 "I64u"
    #endif
    
    int main(void)
    {
        char fmt[64];
    
        printf("\n%s\n%s\n%s\n", H_SEP_STAR, Compiler, H_SEP_STAR);
        printf("- unsigned:\n"
               "char...........: [0, %u] (%d bits per char)\n",
               UCHAR_MAX, CHAR_BIT);
        printf("short int......: [0, %u]\n", USHRT_MAX);
        printf("int............: [0, %u]\n", UINT_MAX);
        printf("long int.......: [0, %lu]\n", ULONG_MAX);
    #if defined(_UI64_MAX)
        sprintf(fmt, "long int 64....: [0, %%%s]\n", PRIu64);
        printf(fmt, _UI64_MAX);
    #endif
        puts(H_SEP_LINE);
        printf("- signed:\n"
               "char...........: [%d, %d]\n", SCHAR_MIN, SCHAR_MAX);
        printf("short int......: [%d, %d]\n", SHRT_MIN, SHRT_MAX);
        printf("int............: [%d, %d]\n", INT_MIN, INT_MAX);
        printf("long int.......: [%ld, %ld]\n", LONG_MIN, LONG_MAX);
        puts(H_SEP_LINE);
        printf("float..........: [%g, %g]\n", FLT_MIN, FLT_MAX);
        printf("double.........: [%g, %g]\n", DBL_MIN, DBL_MAX);
        printf("long double....: [%Lg, %Lg]\n", LDBL_MIN, LDBL_MAX);
        puts(H_SEP_LINE);
        printf("FLT_EPSILON....: %g\n", FLT_EPSILON);
        printf("DBL_EPSILON....: %g\n", DBL_EPSILON);
        printf("LDBL_EPSILON...: %Lg\n", LDBL_EPSILON);
        puts(H_SEP_STAR);
    
        return 0;
    }

    Vale forse la pena di ricordare ai più distratti che tale esempio, specifico per Windows, non prevede la compilazione con derivati del GCC.
    Ultima modifica di M.A.W. 1968; 18-10-2014 a 12:27
    • Un plauso a Grisha Perelman, raro esempio di genuino anticonformismo umano e scientifico.

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.