2013-08-21 15 views
8

Ehm .. Io tipo' di se questo modificatori come lungo/breve espande/riduce quantità di memoria allocata quando vengono creati variabile, ma ...Perché "long int" ha le stesse dimensioni di "int"? Questo modificatore funziona a tutti?

#include <stdio.h> 

#define test_int int 
#define long_int long int 
#define long_long_int long long int 

void main() 
{ 
    printf("%i\n", sizeof (test_int)); //output 4 
    printf("%i\n", sizeof (long_int)); //output 4. Why? wasn't I modified it's size? 
    printf("%i\n", sizeof (long_long_int)); //output 8 
} 

Per ragioni sconosciute, si stampa il dimensione di int e lungo int uguale. Io uso vC++ 2010 express edition. Siamo spiacenti, difficile trovare la risposta in google, mostra sempre lungo e int come tipi separati.

+2

Perché * non dovrebbe * le dimensioni essere le stesse ?! I tipi sono diversi, questo è tutto ciò che conta. Ogni tipo può rappresentare un insieme di valori prescritto dallo standard, ma è libero di essere in grado di rappresentare di più. –

+1

Che cosa è il modificatore ** long **? Non dovrebbero espandere la quantità di memoria allocata? – Kosmos

+0

Nulla di ciò ha a che fare con "memoria" o "allocazione" e "long" non è un "modificatore". Piuttosto, 'int' e' long int' sono due tipi diversi. Entrambi rappresentano numeri interi. –

risposta

12

La ragione per cui MS scelgono di fare long 32 bit anche su un sistema a 64 bit è che l'API di Windows esistente, per ragioni storiche utilizzare una miscela di int e long per cose simili, e l'aspettativa è che questo è s Valore a 32 bit (parte di questo risale a volte in cui Windows era un sistema a 16 bit). Quindi, per convertire il vecchio codice nella nuova architettura a 64 bit, hanno scelto di mantenere long a 32 bit, in modo che le applicazioni che mischiano int e long in vari punti sarebbero comunque state compilate.

Non c'è nulla nello standard C++ che impone che uno long debba essere più grande di int (non è certamente nella maggior parte dei sistemi a 32 bit). Tutto lo standard dice che la dimensione di short < = int < = long - e che short è di almeno 16 bit, se la memoria serve [non necessariamente espresso come "dovrebbe essere di almeno 16 bit", penso che menzioni l'intervallo di valori].

+0

In effetti, si dice che 'short' dovrebbe contenere almeno da -32767 a +32767. Si noti che lo standard non richiede -32768 (il valore più basso per un numero di 16 bit nel complemento * 2 *) perché specifica come devono essere gestiti i numeri negativi. – Medinoc

+0

Grazie mille Mats, ma sembra lungo viene usato come un altro alias per int negli ultimi 30 anni! se non sarà più grande di questo, perché preoccuparsi di menzionarlo nello standard? Non ha senso avere qualcosa chiamato long, e non in una sola volta in 30 anni, nei principali compilatori e sistemi, non fornendo più spazio di int! Questo è ridicolo, tutte le nuove lingue hanno una semantica significativa, il C++ è un'eccezione in tutto ciò che sembra! – Breeze

+1

@Hossein: 30 anni fa, molti compilatori avevano 'int' come valore a 16 bit, e' long' era 32. In questi giorni, su piattaforme non Windows con processori a 64 bit, 'long' è effettivamente 64 bit , dove 'int' è 32 bit. Ma il punto principale è che non esiste alcuna GARANZIA che il tipo sia una dimensione particolare per 'long', diversa da un minimo di 32 bit. Spetta al compilatore se è più grande o meno. –

1

Implementazioni di C e C++, una lunga è maggiore o uguale a un int. Le piattaforme desktop più popolari di oggi, come Windows e Linux, funzionano principalmente con processori a 32 bit e la maggior parte dei compilatori per queste piattaforme utilizza un int a 32 bit che ha le stesse dimensioni e la stessa rappresentazione di una lunga.

+3

Che è incorret, 'long' è" grande o più grande di 'int'". Nessun requisito per essere più grande. –

+0

@MatsPetersson 'sizeof (int) <= sizeof (long)'. per 32 bit è uguale ma su 64 bit è diverso. –

+1

Su 64-bit potrebbe essere diverso. Ad esempio, non è su una macchina Windows. –

0

Qui sta l'ordinazione

char 
short (int) 
int 
long (int) 
long long (int) 

La norma richiede che sizeof(char) == 1 è vero. Lo standard richiede inoltre che: int abbia almeno 16 bit. long int è di almeno 32 bit e long long int ha almeno 64 bit.

Con processori a 32 bit in fase di mainstream, i compilatori in genere impostano int in 4 byte. L'estensione non si è ancora verificata sui sistemi a 64 bit (per MSVC comunque) per motivi di compatibilità.

+0

urgh forse è per questo che ho pensato che se int lungo mi dovrebbe essere più di int. quando stavo imparando C++, ho iniziato da borland C++ 3.1 – Kosmos

+0

C richiede anche che int sia almeno 16 bit e lunga almeno 32 bit. – Potatoswatter

+0

Non sono sicuro che si possa dire che 'int' è stato sempre" tipicamente "16 bit. Tornando a 16 bit 'int' era comune, le macchine variavano molto di più, e c'erano probabilmente altrettante che avevano' int' a 32 bit (e almeno alcune che avevano 'int' a 36 bit, o altre varianti che sarebbero state considerato esotico oggi). –

4

Tutto ciò che lo standard richiede è che:

sizeof(char) == 1 

e

sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long) 

(e che i corrispondenti tipi senza segno hanno le stesse dimensioni tipi firmati).

In aggiunta, ci sono dimensioni minime per ogni tipo, indirettamente specificato da limiti sui valori della INT_MAX, ecc .: un char deve essere almeno di 8 bit, un short e un int 16, un e un long long 64.

Su piattaforme 16 bit, è usuale per entrambi short e int a essere 16 bit; su piattaforme a 32 bit (e le piattaforme 36 e 48 bit ancora esistenti), int e long sono quasi sempre le stesse dimensioni . Sulle moderne piattaforme a 64 bit (con byte indirizzamento), la soluzione razionale sarebbe rendere tutti i quattro tipi hanno diverse dimensioni (anche se si potrebbe sostenere che secondo lo standard, int dovrebbe essere di 64 bit, il che significherebbe che int, long e long long tutti avevano le stesse dimensioni).

0

Il punto è che si interpreta male il significato di int e long (che non è un aggettivo).

Nei lo standard definisce è che il numer di bit in ciascun tipo richiede questa relazione per rimanere sul posto:

sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long). 

int, di per sé, può essere fino a quando un short fino a finché un long a seconda di come viene concepita l'implementazione.

I progettisti di compilatori tendono a massimizzare le prestazioni dell'aritmetica int, rendendola la dimensione naturale per il processore o il sistema operativo sottostante e impostando gli altri tipi di conseguenza.

Ma l'utilizzo di long int, dal int può essere omesso, è lo stesso di long per definizione.

+0

sizeof (long) == sizeof (long long) è possibile e comune tra le piattaforme a 64 bit oltre a Windows. – Potatoswatter

+0

@Potatoswatter: ???? Ho scritto <= ... –