[RISOLTO] Dimensione tipi dato in C
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.
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.
-
- 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
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 ?
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.
- targzeta
- 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
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
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
- shark1500
- 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
Con sizeof(), ad esempio
Per rispondere a spina, cambia a seconda dell'architettura, non si possono fare assunzioni di principio sulla dimensione dei vari tipi.
Codice: Seleziona tutto
printf("size int: %d\n", sizeof(int));
- targzeta
- 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
Ma ne siete proprio sicuri? Il file stdint.h (che uso spesso) riporta, tra l'altro, quanto segue:
Però ripeto, posso sbagliarmi,
Emanuele
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;
Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
- lamarozzo
- 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
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()
dal compilatore. Se si vuole un codice portabile bisogna usare sizeof()
- brg
- 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
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.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()
- targzeta
- 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
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
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
-
- 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
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 ?
Siete tutti concordi con me ?
- shark1500
- 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
Ho fatto un paio di prove.
32bit:
32bit:
64bit:signed char: 1
short int: 2
int: 4
long int: 4
long long int: 8
char *: 4
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 riportosigned char: 1
short int: 2
int: 4
long int: 8
long long int: 8
char *: 8
K&RII pag. 36.int will normally be the natural size for a particular machine[...]either 16 ore 32 bit
-
- 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
Quindi il range che devo considerare è quello indicato nei libri sul C ? Puoi cortesemente riportarli per maggior chiarezza per tutti shark1500 ?
-
- 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
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 ?
- targzeta
- 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
@shark. Non capisco perché ci hai messo in mezzo anche i puntatori, quelli è chiaro che cambiano.
Quello che ho capito da questa discussione è che:
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
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.
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
- wakkokid
- 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
Io no.giorgik ha scritto:Il range dovrebbe essere dato da -2^n e +(2^n) -1
Siete tutti concordi con me ?
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.
- shark1500
- 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
Posso farlo, ma non servirebbe, quelli vanno "sempre" bene.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.
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
- targzeta
- 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
Beh, allora shark, convieni con me che non è l'architettura che fa la vera differenza?
Emanuele
Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama