Differenza tra size_t e unsigned int?


107

Sono così confuso su size_t. Ho cercato su Internet e ovunque ho menzionato che size_tè un tipo senza segno, quindi può rappresentare solo valori non negativi.

La mia prima domanda è: se è usato per rappresentare solo valori non negativi, perché non lo usiamo unsigned intinvece di size_t?

La mia seconda domanda è: sono size_te unsigned intintercambiabili o no? Se no, allora perché?

E qualcuno può darmi un buon esempio size_te brevemente del suo funzionamento?


5
typedef /*This part is implementation dependent */ size_t;
P0W

5
possibile duplicato di unsigned int vs. size_t

Risposte:


87

se è usato per rappresentare un valore non negativo, perché non usiamo unsigned intinvece disize_t

Perché unsigned intnon è l'unico tipo intero senza segno. size_tpotrebbe essere qualsiasi unsigned char, unsigned short, unsigned int, unsigned longo unsigned long long, a seconda dell'implementazione.

La seconda domanda è questa size_te unsigned intsono intercambiabili oppure no e se no allora perché?

Non sono intercambiabili, per il motivo spiegato sopra ^^.

E qualcuno può darmi un buon esempio di size_t e del suo breve funzionamento?

Non capisco bene cosa intendi con "il suo breve lavoro". Funziona come qualsiasi altro tipo non firmato (in particolare, come il tipo a cui è assegnato). Sei incoraggiato a usare size_tquando descrivi le dimensioni di un oggetto. In particolare, l' sizeofoperatore e varie funzioni di libreria standard, come strlen(), return size_t.

Bonus: ecco un buon articolo su size_t(e sul ptrdiff_ttipo strettamente correlato ). Ragiona molto bene perché dovresti usarlo.


1
Come può size_tessere esattamente un unsigned char? È nello standard consentito? Voglio dire con quell'idea come ci si potrebbe aspettare che qualcuno usi calloc()(e la famiglia), strlen()ecc.? Mi sembra assurdo.
Pryftan

Penso che size_tsia definito nello standard come un "tipo intero senza segno", ma non richiede che sia uguale a nessuno di unsigned {char, short, int, long, long long}.
Paul Hankin

80

Esistono 5 tipi di interi senza segno standard in C:

  • unsigned char
  • unsigned short
  • unsigned int
  • unsigned long
  • unsigned long long

con vari requisiti per le dimensioni e gli intervalli (in breve, l'intervallo di ciascun tipo è un sottoinsieme dell'intervallo del tipo successivo, ma alcuni di essi possono avere lo stesso intervallo).

size_tè un typedef(cioè un alias) per un tipo senza segno, (probabilmente uno dei precedenti ma forse un tipo intero senza segno esteso , sebbene sia improbabile). È il tipo fornito sizeofdall'operatore.

Su un sistema, potrebbe avere senso utilizzare unsigned intper rappresentare le dimensioni; in un altro, potrebbe avere più senso usare unsigned longo unsigned long long. ( size_tè improbabile che sia unsigned charo unsigned short, ma è consentito).

Lo scopo di size_tè quello di sollevare il programmatore dal doversi preoccupare di quale dei tipi predefiniti viene utilizzato per rappresentare le dimensioni.

Il codice che presuppone sizeofrestituisce un fileunsigned int non sarebbe portabile. Il codice che presuppone che restituisca a size_tè più probabile che sia portabile.


6
Penso che questa dovrebbe essere la risposta accettata perché spiega perché dovresti usare size_t
kuchi

@ keith-Thompson Quindi questo significa che il tipo specifico (cioè unsigned int, unsigned longetc.) che size_tcorrisponde alla dipende dalla macchina sulla quale viene eseguito il codice? cioè su un'architettura di macchina, corrisponde a unsigned intma su un'altra architettura a cui corrisponderà unsigned long, ecc?
Richie Thomas,

1
@RichieThomas: Dipende dall'implementazione C. Due compilatori diversi sulla stessa architettura potrebbero scegliere tipi diversi per size_t, soprattutto se, ad esempio, unsigned longe unsigned long longhanno le stesse dimensioni.
Keith Thompson,

@RichieThomas Anche questo fa parte. Vale a dire che il massimo di long, long longecc. Dipendono dal sistema: se dai un'occhiata limits.h, almeno sotto Unices vedrai che il valore massimo per int dipende dalla dimensione della parola del sistema.
Pryftan

1
@Pryftan Dai un'occhiata alla serie Motorola 68000, anche la vecchia serie Intel x86 (che risale all'8086 e all'8088).
Keith Thompson

10

size_t ha una restrizione specifica.

Citando da http://www.cplusplus.com/reference/cstring/size_t/ :

Alias ​​di uno dei tipi di interi senza segno fondamentali.

È un tipo in grado di rappresentare la dimensione di qualsiasi oggetto in byte : size_t è il tipo restituito dall'operatore sizeof ed è ampiamente utilizzato nella libreria standard per rappresentare dimensioni e conteggi.

Non è intercambiabile con unsigned intperché la dimensione di intè specificata dal modello dati. Ad esempio LLP64 utilizza un 32 bit inte ILP64 utilizza un 64 bit int.


5
Da dove viene quella citazione? (Non è dallo standard C.)
Keith Thompson,

2
La domanda è contrassegnata c . Lo standard C ++ non ha alcun rapporto con C.
IInspectable

7

size_t viene utilizzato per memorizzare le dimensioni degli oggetti dati ed è garantito che sia in grado di contenere le dimensioni di qualsiasi oggetto dati che la particolare implementazione C può creare. Questo tipo di dati può essere più piccolo (in numero di bit), più grande o esattamente uguale a unsigned int.


4

Oltre alle altre risposte documenta anche il codice e dice alle persone che stai parlando della dimensione degli oggetti in memoria


Buon punto. Una appleè una mela , una size_tè una dimensione ...
dom_beau

2

Il tipo size_t è un tipo intero senza segno di base del linguaggio C / C ++. È il tipo di risultato restituito dall'operatore sizeof. La dimensione del tipo viene scelta in modo che possa memorizzare la dimensione massima di un array teoricamente possibile di qualsiasi tipo. Su un sistema a 32 bit size_t richiederà 32 bit, su uno a 64 bit 64 bit. In altre parole, una variabile di tipo size_t può memorizzare in modo sicuro un puntatore. L'eccezione è rappresentata dai puntatori alle funzioni di classe, ma questo è un caso speciale. Sebbene size_t possa memorizzare un puntatore, è meglio usare un altro tipo intero senza segno uintptr_t per quello scopo (il suo nome riflette la sua capacità). I tipi size_t e uintptr_t sono sinonimi. Il tipo size_t viene solitamente utilizzato per i contatori di loop, l'indicizzazione di array e l'aritmetica degli indirizzi. Il valore massimo possibile del tipo size_t è costante SIZE_MAX.


1
size_tpuò memorizzare la dimensione di ogni singolo oggetto. Un puntatore può puntare a qualsiasi byte di qualsiasi oggetto. È possibile disporre di un sistema con, ad esempio, uno spazio degli indirizzi a 64 bit che limita la dimensione di qualsiasi oggetto a 2 ** 32-1 byte. Non vi è alcuna garanzia che size_te uintptr_tsiano dello stesso tipo.
Keith Thompson,

1

In parole semplici size_t è dipendente dalla piattaforma e così come dall'implementazione mentre unsigned int dipende solo dalla piattaforma.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.