Newsgroup: it.comp.lang.c
Titolo: Dimensione di un int

Qual'è il massimo numero che può essere rappresentato da un int nello Ansi
C? Pongo questa domanda perchè ho creato matrici memorizzate in maniera
contigua per righe di dimensione molto elevata (400x400 per ora) e quindi
l'indice dell'array per accedervi supera i 32000 che sapevo essere il limite
degli int. Devo ricorrere ai long per gli indici?
Grazie int anticipo per la risposta
 e ciao ciao
Antonio

 degli int. Devo ricorrere ai long per gli indici?
*Probabilmente* int e long sulla tua macchina hanno la stessa lunghezza.
Sulla mia e' cosi:
short : 16 bits
int : 32 bits
long : 32 bits
per saperlo puoi utilizzare l'operatore sizeof().
sizeof(long);
sizeof(int);
sizeof(short);
4 bytes sono 32 bits, 2 16 bits.
Se vuoi invece sapere il limite (numerico) basta che includi <limits.h> e
poi usi le costanti:
INT_MAX
INT_MIN
LONG_MAX
LONG_MIN
SHRT_MAX
SHRT_MIN
UINT_MAX
ULONG_MAX
USHRT_MAX
etc....
quelli che iniziano con U sono unsigned (solo positivi).
Tommy

Mi sarebbe anche utile sapere quale sia il massimo numero rappresentabile da
un int sul compilatore C di Linux (il GCC se non mi sbaglio).
AriGrazie
e ariciao
Antonio

... Devo ricorrere ai long per gli indici?
Su un sistema a 32 bit di solito un int ha come massimo un paio di
miliardi... Vedi un po' tu.
C:\>iao Angelo
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 un int sul compilatore C di Linux (il GCC se non mi sbaglio).
prendi la tua macchina linux, usi il gcc per compilare un programma che
stampi il valore di INT_MAX.
La risposta sicura non esiste..... linux e gcc girano su varie piattaforme,
dipende dalla macchina piu' che da compilatore.
Quindi tutto cio' che puoi sapere e' INT_MAX su di una certa macchina con un
certo OS ed un certo compilatore.
Tommy

 miliardi... Vedi un po' tu.
è che io ero fermo alla versione a 16 bit dell'int che ha massimo pari a
32000 (e qualcosa) ma a quanto pare ora si chiama short.
2 miliardi mi bastano e mi avanzano.
Grazie e ciao
Antonio

 32000 (e qualcosa) ma a quanto pare ora si chiama short.
2 elevato alla 15, il tutto -1, ovvero: 32767
15 bits perche' uno lo usi per il segno;
-1 in quanto tra i "positivi" e' rappresentato anche lo 0.
(tutto questo nel complemento a 2)
Tommy

 15 bits perche' uno lo usi per il segno;
non è proprio così, un bit per il segno lo si riserva nella rappresentazione
IEEE in virgola mobile (sia in single che in double precision)
Nel complemento a 2 non serve "sprecare" un bit nel segno.
2^16/2  (/2 perchè metà sono positivi e metà negativi)
Ciao
- -- 
No matter. Try again. Fail again. Fail better.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.2 (GNU/Linux)
iD8DBQE/Ff5cQb6qi6QXZLkRAkJ2AKCfyC8bXPaOeYN8m+buwRcMyIDlQQCbBLkW
bFUwDpCXZjsJx9CXe5uKD4A=
=RDSt
-----END PGP SIGNATURE-----

 2^16/2  (/2 perchè metà sono positivi e metà negativi)
?!?
Beh, se usi gli unsigned hai 16 bits a tua disposizione:
da 0 a 65535
Se invece usi gli interi signed allora puoi capire se un numero e' positivo
o negativo guardando l'ultimo bit (quello piu' significativo).
Se e' 1 allora e' negativo. Se e' 0 allora e' positivo.
Se non ti piace dire "che uno lo usi per il segno" di quello che vuoi ma
questo e' il concetto!
In pratica poi il limite positivo (INT_MAX) e' quello che si ottiene usando
15 bits:
32767
Ovviamente il range e': -32768 a +32767
Ed infatti io non ho mai parlato di sprecare, e nemmeno di riservare.
Semplicemente i positivi possono usare solo 15 bits, il 16, in quanto
positivi deve rimanere 0.
Quindi usi solo 15 bits. Quello che ho detto: "15 bits perche' uno lo usi
per il segno"!
E poi fare 2^16/2 e' la stessa cosa che fare 2^15.
Non capisco la natura della tua discussione.
Tommy

 Se e' 1 allora e' negativo. Se e' 0 allora e' positivo.
sì, ma la mia "precisazione" era in realtà una stupidata.
Volevo solo marcare il fatto che il bit piu' significativo, nei numeri con
segno, non è 1 strettamente per il fatto che un numero è negativo, ma piu'
che altro questo è un riflesso della regola complemento a 2.
Puo' essere una sciocchezza, ma qualcuno potrebbe altrimenti pensare di
invertire il segno di un numero semplicemente cambiando il primo bit (cosa
che invece è ammissibile nei floating point), tutto qui.
Ciao
