Repository 32bit  Forum
Repository 64bit  Wiki

[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.

[RISOLTO] Dimensione tipi dato in C

Messaggioda giorgik » mar feb 28, 2012 12:02

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 mar 03, 2012 9:32, modificato 1 volta in totale.
giorgik
Linux 1.0
Linux 1.0
 
Messaggi: 52
Iscritto il: lun giu 21, 2010 12:40
Località: Torino
Slackware: 13.37
Kernel: 2.6.37
Desktop: KDE

Re: Dimensione tipi dato in C

Messaggioda targzeta » mar feb 28, 2012 12:12

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
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 6185
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: Dimensione tipi dato in C

Messaggioda shark1500 » mar feb 28, 2012 12:16

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
shark1500
Linux 2.6
Linux 2.6
 
Messaggi: 785
Iscritto il: gio apr 03, 2008 13:33
Località: Modna
Slackware: current
Kernel: 2.6.27.7-smp
Desktop: kde

Re: Dimensione tipi dato in C

Messaggioda targzeta » mar feb 28, 2012 12:20

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
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 6185
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: Dimensione tipi dato in C

Messaggioda lamarozzo » mar feb 28, 2012 13:31

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
lamarozzo
Linux 2.6
Linux 2.6
 
Messaggi: 732
Iscritto il: mer lug 13, 2005 23:00
Località: Roma
Desktop: xfce
Distribuzione: archlinux

Re: Dimensione tipi dato in C

Messaggioda brg » mar feb 28, 2012 14:40

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
brg
Linux 2.4
Linux 2.4
 
Messaggi: 262
Iscritto il: sab mar 12, 2011 14:20
Località: Montecatini
Slackware: 14.1
Kernel: 3.10.17
Desktop: KDE4

Re: Dimensione tipi dato in C

Messaggioda targzeta » mar feb 28, 2012 16:16

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
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 6185
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: Dimensione tipi dato in C

Messaggioda giorgik » mar feb 28, 2012 19:14

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 ?
giorgik
Linux 1.0
Linux 1.0
 
Messaggi: 52
Iscritto il: lun giu 21, 2010 12:40
Località: Torino
Slackware: 13.37
Kernel: 2.6.37
Desktop: KDE

Re: Dimensione tipi dato in C

Messaggioda shark1500 » mar feb 28, 2012 19:15

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.
Avatar utente
shark1500
Linux 2.6
Linux 2.6
 
Messaggi: 785
Iscritto il: gio apr 03, 2008 13:33
Località: Modna
Slackware: current
Kernel: 2.6.27.7-smp
Desktop: kde

Re: Dimensione tipi dato in C

Messaggioda giorgik » mar feb 28, 2012 19:29

Quindi il range che devo considerare è quello indicato nei libri sul C ? Puoi cortesemente riportarli per maggior chiarezza per tutti shark1500 ? :)
giorgik
Linux 1.0
Linux 1.0
 
Messaggi: 52
Iscritto il: lun giu 21, 2010 12:40
Località: Torino
Slackware: 13.37
Kernel: 2.6.37
Desktop: KDE

Re: Dimensione tipi dato in C

Messaggioda giorgik » mar feb 28, 2012 19:42

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 ?
giorgik
Linux 1.0
Linux 1.0
 
Messaggi: 52
Iscritto il: lun giu 21, 2010 12:40
Località: Torino
Slackware: 13.37
Kernel: 2.6.37
Desktop: KDE

Re: Dimensione tipi dato in C

Messaggioda targzeta » mar feb 28, 2012 19:49

@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
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 6185
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: Dimensione tipi dato in C

Messaggioda wakkokid » mar feb 28, 2012 21:00

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
wakkokid
Linux 2.4
Linux 2.4
 
Messaggi: 339
Iscritto il: gio gen 27, 2005 0:00
Kernel: 2.6.3*
Desktop: Kde4
Distribuzione: Debian

Re: Dimensione tipi dato in C

Messaggioda shark1500 » mar feb 28, 2012 22:40

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
shark1500
Linux 2.6
Linux 2.6
 
Messaggi: 785
Iscritto il: gio apr 03, 2008 13:33
Località: Modna
Slackware: current
Kernel: 2.6.27.7-smp
Desktop: kde

Re: Dimensione tipi dato in C

Messaggioda targzeta » mer feb 29, 2012 16:27

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

Emanuele
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 6185
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Prossimo

Torna a Gnu/Linux in genere

Chi c’è in linea

Visitano il forum: Bing [Bot] e 3 ospiti