Newsgroup: it.comp.lang.c
Titolo: int: da -32768 a 32767.... ma non mi pare!?

Ciao. Una domanda sul tipo int.
Leggo: Int: sottoinsieme degli interi relativi da -32768 = 2^15 a
32767 = 2^15 - 1.
Quindi capisco che  una variabile di tipo int in particolare non può
valere 32768.
Peccato che sia subito contraddetto da questo esempietto che mi sono
fatto:
#include <stdio.h>
#include <stdlib.h>
int main()
{
    int x;
    printf("Inserire un valore per la variabile x di tipo int\n");
    scanf("%d", &x);
    printf("x = %d\n", x);
    system("PAUSE");
    return 0;
}
Ho inserito da tastiera il numero 32768 e il programma ha prodotto
come risultato il seguente:
Inserire un valore per la variabile x di tipo int
32768
x = 32768
Premere un tasto per continuare . . .
Io mi sarei aspettato un errore da parte del compilatore, giacché,
come dicevo sopra, poiché ho dichiarato x come variabile di tipo
intero, x può variare solo da -32768 a 32767.
Dove mi sbaglio?
Grazie, Ciao

 
Non e' un'affermazione vera.
Il compilatore puo' interpretare gli int come numeri a 32 bit.
Devi dare un'occhiata alle caratteristiche del tuo compilatore.
Ciao
G.

 valere 32768.
None. Dove hai letto una cosa del genere ?
la lunghezza del tipo int dipende dal processore e dalla
specifica implementazione del compilatore e dallo standard
di riferimento (qualche variazione dalle origini c'e' stata).
Normalmente un "int" corrisponderebbe alla lunghezza della parola
"naturale" della CPU.
Se il compiler e' almeno >=C89, c'e' un file <limits.h> in
cui sono inseriti i limiti dei vari tipi numerici: controlla.
Probabilmente stai usando un compilatore che ha int di 32bit,
Su CPU a 8bit/16bit, l' int potrebbe essere (e normalmente e')
a 16 bit e ha i limiti che citi. Su un moderno PC con i
sistemi operativi piu' comuni, l' int e' (normalmente) a 32bit,
anche se la parola naturale e' di 64bit ;-)
Bye
B.

On 24 Ago, 11:26, brixrix99luftballon

giocando col sizeof() ho trovato:
# bit utilizzati per rappresentare una variabile di tipo int = 32
# bit utilizzati per rappresentare una variabile di tipo long int = 32
# bit utilizzati per rappresentare una variabile di tipo short int =
16
# bit utilizzati per rappresentare una variabile di tipo unsigned int
= 32
# bit utilizzati per rappresentare una variabile di tipo float = 32
# bit utilizzati per rappresentare una variabile di tipo double = 64


 - Mostra testo citato -
Quindi deduco che la CPU del mio P4 su cui ho WIN XP (ed il mio
compilatore C è quello integrato in Dev C++) è a 32 bit?

andrew ha scritto:

Nahh! Non puoi dedurre da quello che fa il compilatore il
tipo di architettura della CPU ;-)
Su X86 puoi benissimo compilare ed eseguire programmi
con int a 16bit, usando vecchi compilatori a 16bit, pur
essendo la CPU host a 64bit....
L'implementazione del compilatore dipende da molti fattori:
diciamo che avere int a 64bit su CPU a 64 bit, anche se naturale,
potrebbe portatare ad uno spreco di memoria consistente, per cui l' 
implementatore puo' benissimo decidere che gli int del suo compilatore
sono a 32bit....o addirittura a 16bit (questo ad esempio e' possibile
su alcuni compilatori embedded, dove e' possibile su CPU a 32/64bit 
'ridurre' il size dell' int da 64 a 32 o 16... in dipendenza del target 
del programma e della dimensione di memoria a disposizione, ma non ha 
molto senso per macchine tipo PC in cui la memoria abbonda).
bye
b.

32767 = 2^15 - 1.
Leggi dove?
Il tuo sbaglio è leggere da una fonte che non è allineata alle moderne
architetture, cui il tuo sistema con tutta probabilità appartiene.
L'int sulla tua macchina è a 32 bit mentre la tua fonte fa
evidentemente riferimento a una piattaforma in cui l'int è a 16 bit.
A priori non si può dire nulla sulla lunghezza degli interi. Tutto ciò
che una piattaforma può garantirti è:
1 = sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <=
sizeof(long long)


Microsoft ha scelto per i propri sistemi operativi a 64bit il modello
LLP64:
short e' 16 bit
int e' 32 bit
long e' 32 bit
long long e' 64bit
puntatore e' 64bit