[RISOLTO] Dimensione tipi dato in C

Postate qui per tutte le discussioni legate a Linux in generale.

Moderatore: Staff

Regole del forum
1) Citare sempre la versione di Slackware usata, la versione del Kernel e magari anche la versione della libreria coinvolta. Questi dati aiutano le persone che possono rispondere.
2) Per evitare confusione prego inserire in questo forum solo topic che riguardano appunto Gnu/Linux in genere, se l'argomento è specifico alla Slackware usate uno dei forum Slackware o Slackware64.
3) Leggere attentamente le risposte ricevute
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
giorgik
Linux 0.x
Linux 0.x
Messaggi: 52
Iscritto il: lun 21 giu 2010, 13:40
Slackware: 13.37
Kernel: 2.6.37
Desktop: KDE
Località: Torino

[RISOLTO] Dimensione tipi dato in C

Messaggio da giorgik »

Ciao a tutti, avrei una domanda da porre sulla programmazione in C:
la dimensione dei tipi di dato (char, int, float, double e sue varianti) varia a seconda della macchina, come faccio a determinare questa dimensione ?
Ultima modifica di giorgik il sab 3 mar 2012, 9:32, modificato 1 volta in totale.

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6631
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: Dimensione tipi dato in C

Messaggio da targzeta »

sizeof(tipo)

Inoltre mi sembra strano che la dimensione vari. Un int dovrebbe sempre essere di 4 byte, se vuoi un intero a 8 byte si dovrebbe usare 'long int'. Però posso sbagliarmi.

Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
shark1500
Linux 3.x
Linux 3.x
Messaggi: 785
Iscritto il: gio 3 apr 2008, 14:33
Slackware: current
Kernel: 2.6.27.7-smp
Desktop: kde
Località: Modna

Re: Dimensione tipi dato in C

Messaggio da shark1500 »

Con sizeof(), ad esempio

Codice: Seleziona tutto

printf("size int: %d\n", sizeof(int));
Per rispondere a spina, cambia a seconda dell'architettura, non si possono fare assunzioni di principio sulla dimensione dei vari tipi.

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6631
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: Dimensione tipi dato in C

Messaggio da targzeta »

Ma ne siete proprio sicuri? Il file stdint.h (che uso spesso) riporta, tra l'altro, quanto segue:

Codice: Seleziona tutto

typedef signed char             int8_t;
typedef short int               int16_t;
typedef int                     int32_t;
typedef long int                int64_t;
typedef long long int           int64_t;
Però ripeto, posso sbagliarmi,
Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
lamarozzo
Linux 3.x
Linux 3.x
Messaggi: 732
Iscritto il: gio 14 lug 2005, 0:00
Desktop: xfce
Distribuzione: archlinux
Località: Roma

Re: Dimensione tipi dato in C

Messaggio da lamarozzo »

Se non sbaglio, negli stardard del C non e' definita la dimensione dei tipi (piuttosto il loro range). Quindi sostanzialmente dipende
dal compilatore. Se si vuole un codice portabile bisogna usare sizeof()

Avatar utente
brg
Linux 3.x
Linux 3.x
Messaggi: 580
Iscritto il: sab 12 mar 2011, 14:20
Slackware: 15.0
Kernel: 5.15.117
Desktop: KDE5
Località: Montecatini
Contatta:

Re: Dimensione tipi dato in C

Messaggio da brg »

lamarozzo ha scritto:Se non sbaglio, negli stardard del C non e' definita la dimensione dei tipi (piuttosto il loro range). Quindi sostanzialmente dipende
dal compilatore. Se si vuole un codice portabile bisogna usare sizeof()
Esatto il formato "int" è definito in ANSI C come la dimensione dei registri della cpu, l'unico modo per sapere con esattezza la dimensione dei vari formati è usare sizeof. Per questo standard più recenti hanno introdotto i tipi int32_t in vista di una maggiore portabilità del codice.

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6631
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: Dimensione tipi dato in C

Messaggio da targzeta »

Da quello che ho capito io leggendo un po' su internet invece sembra che la dimensione degli interi non ha molto a che vedere con l'architettura (la mia macchina dovrebbe avere registri a 64bit, eppure gli interi sono a 4 byte). Sembra che dipenda tutto dal compilatore, e mi sembra anche una risposta accettabile: in fondo, è lui che ci compila il codice che poi deve essere eseguito.

Comunque sembra che includere il file stdint.h (che è fornito da gcc, guarda caso) e operare con i tipi di dato lì dentro definiti dovrebbe essere cosa buona e giusta :),
Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

giorgik
Linux 0.x
Linux 0.x
Messaggi: 52
Iscritto il: lun 21 giu 2010, 13:40
Slackware: 13.37
Kernel: 2.6.37
Desktop: KDE
Località: Torino

Re: Dimensione tipi dato in C

Messaggio da giorgik »

Grazie a tutti per il vostro intervento. Quindi penso che la risposta di spina sia la più corretta, in quanto usando il compilatore gcc, solo attraverso il suo file stdint.h, è possibile sapere il formato del tipo di dato. Ovviamente la mia domanda era per poi risalire al range dei valori ammessi da quel tipo di dato. Da qui come dice lamarozzo e shark1500 (con il suo semplice esempio molto efficace) attraverso sizeof() si risale alla sua dimensione massima. Il range dovrebbe essere dato da -2^n e +(2^n) -1
Siete tutti concordi con me ?

Avatar utente
shark1500
Linux 3.x
Linux 3.x
Messaggi: 785
Iscritto il: gio 3 apr 2008, 14:33
Slackware: current
Kernel: 2.6.27.7-smp
Desktop: kde
Località: Modna

Re: Dimensione tipi dato in C

Messaggio da shark1500 »

Ho fatto un paio di prove.

32bit:
signed char: 1
short int: 2
int: 4
long int: 4
long long int: 8
char *: 4
64bit:
signed char: 1
short int: 2
int: 4
long int: 8
long long int: 8
char *: 8
E questo su un amd64 ed un intel a 32, ad esempio PPC cambia ancora (sia 64 che 32). Non si possono fare decisioni a priori sulla dimensione di ogniuno, l'ANSI C riporta (come e` stato detto) il range, inoltre riporto
int will normally be the natural size for a particular machine[...]either 16 ore 32 bit
K&RII pag. 36.

giorgik
Linux 0.x
Linux 0.x
Messaggi: 52
Iscritto il: lun 21 giu 2010, 13:40
Slackware: 13.37
Kernel: 2.6.37
Desktop: KDE
Località: Torino

Re: Dimensione tipi dato in C

Messaggio da giorgik »

Quindi il range che devo considerare è quello indicato nei libri sul C ? Puoi cortesemente riportarli per maggior chiarezza per tutti shark1500 ? :)

giorgik
Linux 0.x
Linux 0.x
Messaggi: 52
Iscritto il: lun 21 giu 2010, 13:40
Slackware: 13.37
Kernel: 2.6.37
Desktop: KDE
Località: Torino

Re: Dimensione tipi dato in C

Messaggio da giorgik »

Sul libro K&R versione italiana a pag.276 è riportato uno stralcio del file limits.h che riporta i range dei vari tipi di dato. Sono dunque questi i valori a cui devo fare riferimento nei miei programmi in C quando effettuo dei calcoli usando le variabili per essere sicuro di aver dimensionato bene le variabili stesse ?

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6631
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: Dimensione tipi dato in C

Messaggio da targzeta »

@shark. Non capisco perché ci hai messo in mezzo anche i puntatori, quelli è chiaro che cambiano.

Quello che ho capito da questa discussione è che:
  • la dimensione di un tipo di dato va determinata con 'sizeof' (ma questo era chiaro anche all'inizio);
  • Io sbagliavo pensando che un intero dovesse sempre essere a 4 byte;
  • se si vuole stare tranquilli sulla dimensione di un tipo di dato intero, allora si dovrebbe usare l'header stdint.h e usare int32_t anziché il semplice int.
L'ultima affermazione, però, è vera solo se è il compilatore a scegliere la dimensione dell'intero, altrimenti non riesco a capire l'esistenza di quel file. A naso dovrebbe garantire che se io uso int32_t, allora avrò sempre un intero a 32bit, a prescindere dall'architettura.

Sarebbe interessante che shark provasse il sizeof() su i tipi di dato esportati da /usr/include/stdint.h per vedere se, ad esempio, un int64_t cambia ancora da macchina a macchina. Secondo me scopriamo che cambia la definizione nel file stdint.h ma che la dimensione è sempre di 8 byte.

Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
wakkokid
Linux 2.x
Linux 2.x
Messaggi: 339
Iscritto il: gio 27 gen 2005, 0:00
Kernel: 2.6.3*
Desktop: Kde4
Distribuzione: Debian
Contatta:

Re: Dimensione tipi dato in C

Messaggio da wakkokid »

giorgik ha scritto:Il range dovrebbe essere dato da -2^n e +(2^n) -1
Siete tutti concordi con me ?
Io no.
Posta una dimensione di N bit,
per gli INTERI UNSIGNED (=solo positivi), il range sarà [0, 2^n -1]
per gli INTERI (positivi e negativi) il range sarà [-2^(n-1), 2^(n-1) -1]
per i numeri in virgola mobile sarà.... più complicato.

Avatar utente
shark1500
Linux 3.x
Linux 3.x
Messaggi: 785
Iscritto il: gio 3 apr 2008, 14:33
Slackware: current
Kernel: 2.6.27.7-smp
Desktop: kde
Località: Modna

Re: Dimensione tipi dato in C

Messaggio da shark1500 »

spina ha scritto:Sarebbe interessante che shark provasse il sizeof() su i tipi di dato esportati da /usr/include/stdint.h per vedere se, ad esempio, un int64_t cambia ancora da macchina a macchina. Secondo me scopriamo che cambia la definizione nel file stdint.h ma che la dimensione è sempre di 8 byte.
Posso farlo, ma non servirebbe, quelli vanno "sempre" bene.
Il mio stdint.h e` il seguente

Codice: Seleziona tutto

#ifndef __int8_t_defined
# define __int8_t_defined
typedef signed char             int8_t;
typedef short int               int16_t;
typedef int                     int32_t;
# if __WORDSIZE == 64
typedef long int                int64_t;
# else
__extension__
typedef long long int           int64_t;
# endif
#endif
Come vedi int64_t cambia nel caso __WORDSIZE sia 64.

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6631
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: Dimensione tipi dato in C

Messaggio da targzeta »

Beh, allora shark, convieni con me che non è l'architettura che fa la vera differenza?

Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Rispondi