2009-07-06 17 views
53

Come titolo: è size_t sempre senza segno, vale a dire per size_t x, èsempre >= 0?è size_t sempre senza segno?

+4

Alcune citazioni da un documento standard per tutte le affermazioni riportate di seguito sarebbero buone. –

+4

Non si tratta della dimensione, è come la si usa :) – ralphtheninja

+8

C'è "ssize_t" per "una dimensione firmata" :) –

risposta

44

. E 'solito definito come qualcosa di simile alle (sistemi a 32 bit) seguente:

typedef unsigned int size_t; 

Riferimento:

C++ Sezione standard 18.1 definisce size_t è in <cstddef> che è descritto in C standard come <stddef.h>.
C standard Sezione 4.1.5 definisce size_t come un tipo intero senza segno del risultato della sizeof operatore

+0

@Neil: lo so. È stata la prima cosa che ho trovato Non ho lo standard C++ a portata di mano, quindi lo sto scaricando (la mia connessione è dannatamente lenta). Nel frattempo, ho messo qualcosa di diverso da me stesso. –

+0

Bene, ho lo standard C++ a portata di mano, ma non riesco a trovarlo, probabilmente perché è effettivamente definito nello standard C (non C99). Spero che qualcuno lo rintracci, perché penso che sia una domanda interessante! –

+0

Ricorda che cplusplus.com ha alcuni siti strani. Guardate questo, per esempio: http://www.cplusplus.com/reference/iostream/ostream/operator%3C%3C/ ora che sono divertenti firme dell'operatore << :) –

14

Sì, size_t è garantito come un tipo senza segno.

46

Secondo 1999 ISO standard C (C99), size_t è di tipo intero senza segno di almeno 16 bit (vedi sezioni 7.17 e 7.18.3).

Lo standard raccomanda inoltre che size_t non dovrebbe avere un grado di conversione intero maggiore di long se possibile, cioè scacciando size_t a unsigned long è problematico se la raccomandazione è seguito.

Lo standard ANSI C (ANSI C) del 1989 non menziona una dimensione minima o un rango di conversione raccomandato.

Lo standard ISO C++ del 1998 (C++ 98) (così come la bozza corrente per C++ 0x) si riferisce allo standard C. Sezione 18.1 recita:

I contenuti sono gli stessi come intestazione libreria standard C <stddef.h> [...]

Secondo la sezione 1.2, questo significa che la biblioteca come definito dallo standard ISO 1990 C (C90), compresa la sua prima modifica dal 1995 (C95):

La biblioteca descritto al punto 7 della ISO/IEC 9899: 1990 e clausola 7 della ISO/IEC 9899/modifica 1: 1995 è di seguito chiamata editore Libreria C standard.

Le parti riguardanti size_t dovrebbero essere ereditati da ANSI C: frontmatter e la sezione numerazione parte, gli standard di C90 e ANSI C sono identici. Avrei bisogno di una copia dell'emendamento normativo per essere sicuro che non ci fossero modifiche rilevanti a stddef.h, ma ne dubito. La dimensione minima sembra essere introdotta con stdint.h, cioè C99.

Si prega di considerare anche la seguente citazione dalla sezione 1.2 di C++ 98:

Tutte le norme sono soggette a revisione, e parti di accordi sulla base della presente norma internazionale sono invitati a verificare la possibilità di applicare il maggior recenti edizioni delle norme indicato di seguito.

+0

Sfortunatamente, la domanda non riguarda C99 ma C++. –

+8

@Neil, beh, deve prendere lo standard C, perché lo standard C++ lo delega :) Non definisce esso stesso size_t :) –

+2

Sì, ma lo standard C++ non fa riferimento allo standard C99. –

5

Secondo lo standard non è firmato, tuttavia ricordo che alcune implementazioni precedenti utilizzavano un tipo firmato per il typedef.

Dal doc GCC più vecchio:

C'è un potenziale problema con il tipo size_t e le versioni di GCC prima del rilascio 2.4. ANSI C richiede che size_t sia sempre un tipo senza segno. Per la compatibilità con i file di intestazione dei sistemi esistenti, GCC definisce size_t in stddef.h come qualsiasi tipo di sistema che sia il sys/types.h del sistema. La maggior parte dei sistemi Unix che definiscono size_t in sys/types.h, lo definiscono come un tipo firmato. Alcuni codice nella libreria dipende da size_t essere un tipo unsigned, e non funziona correttamente se è firmato

Non sono sicuro di quanto sia importante sarebbe quella di evitare che. Il mio codice presuppone che non sia firmato.

+0

Penso che tutti sappiano che probabilmente non è firmato - ma a meno che qualcuno non possa citare un documento standard pertinente, non lo sapremo mai con certezza. –

+0

Al momento non ho a portata di mano il documento standard (anche se sono fiducioso che tutti gli standard pertinenti, C90, C99 e C++ 98 e successivi richiedono che sia senza firma). Tuttavia, volevo solo sottolineare che, indipendentemente dallo standard, ci sono eccezioni potenzialmente importanti dove size_t è un tipo firmato. –

2

La dimensione_t dovrebbe seguire la stessa definizione dello standard C, e in diversi punti nello standard C++ implica che è unsigned natura (in particolare nelle definizioni degli argomenti del template allocator).

Sulla ++ standard C, sezione 18.1 (ISO/IEC 14882 - Prima edizione 1998-01-01):

Tabella 15 elenca i tipi definiti: ptrdiff_t e size_t

3 I contenuti sono gli stessi come intestazione della libreria C standard, con le seguenti modifiche: 4 La macro NULL è una costante di puntatore nullo C++ definita dall'implementazione in questo standard internazionale (4.10).

La macrooffsetof accetta un set limitato di argomenti di tipo in questo standard internazionale. il tipo deve essere una struttura POD o un'unione POD (clausola 9). Il risultato dell'applicazione dell'offset della macro a un campo che è un membro di dati statici o un membro di funzione non è definito. VEDERE ANCHE: sottoclausola 5.3.3, Dimensione, sottoclausola 5.7, Operatori additivi, sottoclausola 12.5, Negozio gratuito e ISO C sottopunto 7.1.6.

1

Oh, questo è semplicemente terribile:

vector<MyObject> arr; 
Fill(arr); 
size_t size = arr.size(); 
for(size_t i = 1; i < size - 1; ++i) 
{ 
    auto obj = arr[i]; 
    auto next = arr[i+1]; 
} 

Ora contemplare il caso d'uso in cui arr è vuoto.