Newsgroup: it.comp.lang.c
Titolo: int     e     long    .... coincidono?!

Ciao.
ho questo dubbio:
Ho eseguito le seguenti istruzioni:
    printf("sizeof(int) = %d\n", sizeof(int));
    printf("sizeof(long) = %d\n", sizeof(long));
esse danno come risultato entrambe 4.
D'altra parte sia long che naturalmente int servono per codificare
degli interi.
Osservo allora che siccome entrambi i tipi occupano 4 byte, i due tipi
devono coicidere.
Da qualche parte mi sbaglio. Potete aiutarmi a capire dove?
Grazie


Le dimensioni dei tipi di variabile variano a seconda del compilatore e 
dell'architettura. in DOS / C era int == short.
Ora, l'ANSI C dovrebbe avere delle dimensioni standard per gli interi, 
ma in genere non conviene fare degli assunti sulle dimensioni.
-- 
God is real, unless if declared integer.
Powered by Debian GNU/Linux

 - Mostra testo citato -
Sicuramente, sono d'accordo con te.
Assumiamo però di ragionare sul mio pc con mio HW e con il mio
compilatore secondo cui int e long sono ambedue 4 byte. (una facile
ricerca su internet ha mostrato che di fatto attualmente i + comuni PC
sono come il mio col mio compilatore, ad ogni modo assumiamo di
ragionare sul mio pc col mio compilatore).
Dunque sul mio PC col mio compilatore, secondo quanto ho descritto nel
mio primo post, utilizzare il tipo int oppure il tipo long è proprio
la stessa cosa.... mi puzza un po' detta così...

 la stessa cosa....
Con queste supposizioni a monte, esatto.


   
Lo standard non dichiara esplicitamente quanto deve essere un long,
salvo che, in C99, deve essere:
1.int
 e short non inferiori a 16bit
2. un long non deve essere inferiore a un int e comunque almeno di 32bit
Ne consegue che su un sistema a 32bit  dove l' int e' implementato con 
un 32 bit
il long puo' essere legalmente e perfettamente equivalente ad un int :-)
L' int per sua natura deve essere, salvo quanto detto al punto 1, il tipo di
dato piu' naturale per il processore, quindi, fatta eccezione per i  
sistemi a 8 bit,
sara' quasi sicuramente equivalente al tipo di bus della CPU usata :
un 16bit per architetture a 16bit, un 32bit in quelle a 32, un 64bit etc....
Per i compilatori pre-C99 non era nemmeno specificato che l' int dovesse 
avere
un size minimo, per cui e' possibile trovare vecchi compilatori a 8bit che
implementavano il tipo int come 8bit... oppure avevano lo short a 8 bit e
l' int a 16bit...
Ci sono compilatori per embedded che permettono di dimensionare
il size dell' int  (16 o 32bit) in modo da ottimizzare la dimensione del 
codice:
Questo significa che e' meglio non fare assunzioni sulla dimensione
dell' int e usare i long quando servono (per facilitare porting)
B.


Int e long possono coincidere ma non bisogna *mai* farci affidamento.
Per esempio col seguente piccolo programma sulla mia solaris sparc con
gcc ottengo 2 risultati diversi a seconda che compili a 32 o a 64 bit.
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
int main()
{
    printf("sizeof char %zd\n", sizeof(char));
    printf("sizeof short %zd\n", sizeof(short));
    printf("sizeof int %zd\n", sizeof(int));
    printf("sizeof long %zd\n", sizeof(long));
    printf("sizeof long long %zd\n", sizeof(long long));
    printf("sizeof size_t %zd\n", sizeof(size_t));
    printf("sizeof int32_t %zd\n", sizeof(int32_t));
    printf("sizeof uint32_t %zd\n", sizeof(uint32_t));
    printf("sizeof void * %zd\n", sizeof(void *));
    return 0;
}
32 bit:
sizeof char 1
sizeof short 2
sizeof int 4
sizeof long 4
sizeof long long 8
sizeof size_t 4
sizeof int32_t 4
sizeof uint32_t 4
sizeof void * 4
64 bit
sizeof char 1
sizeof short 2
sizeof int 4
sizeof long 8
sizeof long long 8
sizeof size_t 8
sizeof int32_t 4
sizeof uint32_t 4
sizeof void * 8
La cosa migliore, ove possibile e' usare types.h.
Usando types.h e il tipo uint32_t uno e' sempre sicuro di avere sempre
4 byte per gli interi.
Ciao,
Cesare

 un 16bit per architetture a 16bit, un 32bit in quelle a 32, un 64bit etc....
Per la verita', non e' solo l'archiettura della macchina a
determinarlo ma anche quella del sistema operativo.
Molti sistemi operativi a 64bit hanno l'int a 32 bit e il long a
64bit, molto spesso per problema di compatibilita' col passato.
Alcuni (esempio Windows NT 64bit), hanno sia l'int che il long a
32bit, e devi usare _int64 (o il long long) per un tipo a 64bit.
Se proprio vuoi generalizzare sul bus della macchina, invece dell'int
e del long, dovresti prendere in considerazione i puntatori.

   
Certo,  mi auto cito :
 >Ci sono compilatori per embedded che permettono di dimensionare
 >il size dell' int  (16 o 32bit) in modo da ottimizzare la dimensione 
del codice
Aggiungo: non solo compilatori per embedded a non solo 32 bit ;-)
B.