Il GCC installato da Slackware è per architetture x86 (32bit) e x86_64. La dimensione predefinita degli operandi per l'x86_64 è 32bit, come per l'x86 (x86_32), mentre per l'x86_16 (8086/80286) è 16 bit e gli interi sono a 16 bit su questa architettura, ma quest'ultima architettura non è supportata da gcc. I processori MIPS64, per quanto ne so, hanno operandi a 64 bit e quindi, a regola, interi a 64 bit.spina ha scritto:Beh, allora shark, convieni con me che non è l'architettura che fa la vera differenza?
Emanuele
[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.
- brg
- Linux 3.x

- Messaggi: 590
- 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
- targzeta
- Iper Master

- Messaggi: 6635
- 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
Però io non metto in dubbio questo. Perdonatemi ma sono cose di architettura che non ricordo più benissimo. Siamo tutti d'accordo che chi fa le operazioni (dovrebbe essere la ALU) lavora sui registri del processore e siccome un processore a 64bit dovrebbe avere registri a 64bit, in teoria potrebbe lavorare anche su interi a 64bit senza problemi. Però ciò non toglie che chi fa i conti a livello software è il compilatore, il quale potrebbe fare degli artifici (ovviamente meno performanti) per far si che io possa lavorare su interi a 64bit anche su macchine a 32bit. Secondo me questo si sposa molto bene con le varie definizioni di int32_t e int64_t.
Siamo tutti d'accordo che un int ha dimensioni variabili (anche se io all'inizio pensavo di no), però vorrei capire se siamo anche d'accordo sul fatto che io possa lavorare bene con interi a 64bit anche su processori a 32bit, se il compilatore mi da una mano.
In soldoni, visto che il problema sollevato è di tipo pratico, quello che vorrei dire al nostro amico che ha aperto il thread è che sì, se vuoi lavorare con il tipo 'int' devi usare un sizeof per capire in range numerico, però se vuoi stare più tranquillo oppure necessiti di un range specifico ti conviene usare i tipi di dati definiti da stdint.h e lavorare con quelli senza il sizeof. Questo implica ovviamente problemi di portabilità e a questo proposito due pagine interessanti sono questa e questa. L'ultimo link risponde anche alla domanda sul range:
Siamo tutti d'accordo che un int ha dimensioni variabili (anche se io all'inizio pensavo di no), però vorrei capire se siamo anche d'accordo sul fatto che io possa lavorare bene con interi a 64bit anche su processori a 32bit, se il compilatore mi da una mano.
In soldoni, visto che il problema sollevato è di tipo pratico, quello che vorrei dire al nostro amico che ha aperto il thread è che sì, se vuoi lavorare con il tipo 'int' devi usare un sizeof per capire in range numerico, però se vuoi stare più tranquillo oppure necessiti di un range specifico ti conviene usare i tipi di dati definiti da stdint.h e lavorare con quelli senza il sizeof. Questo implica ovviamente problemi di portabilità e a questo proposito due pagine interessanti sono questa e questa. L'ultimo link risponde anche alla domanda sul range:
EmanueleAn N-bit signed type has values in the range -2N-1 or 1-2N-1 to 2N-1-1, while an N-bit unsigned type has values in the range 0 to 2N-1.
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
- targzeta
- Iper Master

- Messaggi: 6635
- 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
Quando si dice che il mondo è piccolo. Stavo leggendo un libro che parla di tuttaltro, ma guardate cosa ho trovato:
EmanueleJohn Calcote ha scritto:...
A CPU with a 32-bit machine word size would likely have a C com-
piler with 32-bit int and unsigned types. The sizes of the basic integer types
in the C language are implementation defined. This is by design, in order
to allow implementations to use sizes for char, short, int, and long that are
optimal for each platform.
While this language feature is great for optimizing software designed to
run on one platform, it's not very helpful when choosing types to move data
between platforms. In order to address this problem, engineers have tried
everything from sending network data as strings (think XML), to inventing
their own sized types.
In an attempt to remedy this shortcoming in the language, the C99 stan-
dard provides the sized types intN_t and uintN_t, where N may be 8, 16, 32, or 64.
Unfortunately, not all of today's compilers provide these types. (Not surprisingly,
GNU C has been at the forefront for some time now, providing C99-sized types
with the inclusion of the new stdint.h header file.)
...
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
-
giorgik
- 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 riassumendo, per sapere il range di valori per i tipi di dato:
char 0 - 255
int ?
short int ? (relative varianti signed e unsigned)
long int ? (relative varianti signed e unsigned)
float ? (relative varianti short e long, signed e unsigned)
double ? (relative varianti short e long, signed e unsigned)
per CPU 32 bit e per 64 bit ?
Scusate il lunghissimo elenco
char 0 - 255
int ?
short int ? (relative varianti signed e unsigned)
long int ? (relative varianti signed e unsigned)
float ? (relative varianti short e long, signed e unsigned)
double ? (relative varianti short e long, signed e unsigned)
per CPU 32 bit e per 64 bit ?
Scusate il lunghissimo elenco
- 414N
- Iper Master

- Messaggi: 2923
- Iscritto il: mer 13 feb 2008, 16:19
- Slackware: 15.0
- Kernel: 5.15.19
- Desktop: KDE5
- Località: Bulagna
- Contatta:
Re: Dimensione tipi dato in C
Forse non hai colto il senso dell'ultima citazione riportata da spina: la dimensione dei tipi è variabile da un compilatore all'altro in funzione dell'architettura/piattaforma scelta come target della compilazione. L'unico modo che hai per sapere la dimensione esatta di un tipo all'interno del tuo codice è usare sizeof (tipo), mentre se ti serve avere variabili int/short ecc. grandi esattamente N byte allora devi ricorrere ai tipi definiti dallo standard C99 all'interno dell'header stdint.h.
Per il range di valori forse l'header limits.h può aiutarti
Per il range di valori forse l'header limits.h può aiutarti
-
giorgik
- 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
Ok grazie a tutti per le vostre risposte. Alla prossima