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.

Re: Dimensione tipi dato in C

Messaggioda brg » mer feb 29, 2012 17:12

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

Emanuele


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.
Avatar utente
brg
Linux 2.4
Linux 2.4
 
Messaggi: 254
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 » mer feb 29, 2012 17:45

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:
An 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.


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: 6168
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 targzeta » gio mar 01, 2012 13:11

Quando si dice che il mondo è piccolo. Stavo leggendo un libro che parla di tuttaltro, ma guardate cosa ho trovato:
John 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.)
...

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: 6168
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 » ven mar 02, 2012 20:15

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 :roll:
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 414N » sab mar 03, 2012 9:26

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
Avatar utente
414N
Iper Master
Iper Master
 
Messaggi: 2881
Iscritto il: mer feb 13, 2008 16:19
Località: Bulagna
Slackware: 14.0 (x64)
Kernel: 3.2.29
Desktop: LXDE

Re: Dimensione tipi dato in C

Messaggioda giorgik » sab mar 03, 2012 9:32

Ok grazie a tutti per le vostre risposte. Alla prossima
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

Precedente

Torna a Gnu/Linux in genere

Chi c’è in linea

Visitano il forum: Exabot [Bot] e 2 ospiti