Come titolo: è size_t sempre senza segno, vale a dire per size_t x
, èsempre >= 0
?è size_t sempre senza segno?
risposta
Sì. 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
@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. –
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! –
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 << :) –
Sì, size_t è garantito come un tipo senza segno.
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.
Sfortunatamente, la domanda non riguarda C99 ma C++. –
@Neil, beh, deve prendere lo standard C, perché lo standard C++ lo delega :) Non definisce esso stesso size_t :) –
Sì, ma lo standard C++ non fa riferimento allo standard C99. –
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 definiscesize_t
instddef.h
come qualsiasi tipo di sistema che sia ilsys/types.h
del sistema. La maggior parte dei sistemi Unix che definisconosize_t
insys/types.h
, lo definiscono come un tipo firmato. Alcuni codice nella libreria dipende dasize_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.
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. –
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. –
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.
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.
- 1. Moltiplicazione con segno e senza segno
- 2. Primitive negative senza segno?
- 3. È buona norma usare size_t in C++?
- 4. valori senza segno C
- 5. Il segno di spunta Ascii è sempre rosso nel cellulare
- 6. printf per size_t
- 7. size_t vs. uintptr_t
- 8. max senza diramazione per interi senza segno
- 9. Puntatore di ottimizzazione micro + senza segno + 1
- 10. QVariant firmato/i confronti senza segno
- 11. Doppio senza segno in C++?
- 12. Ricerca senza segno diacritico Loopback
- 13. std :: size_t vs size_t vs std :: string :: size_type
- 14. Avviso C++ C4018: '<': mancata corrispondenza con segno/senza segno
- 15. Come portatile sta trasmettendo -1 a un tipo senza segno?
- 16. Divisione firmata con numeratore senza segno
- 17. C size_t e ssize_t valore negativo
- 18. È un int uguale a quello senza segno o firmato?
- 19. BIGINT valore senza segno è fuori portata My SQL
- 20. qual è il tipo di dati senza segno?
- 21. Qual è l'equivalente di Rust di `size_t`?
- 22. Dove C++ size_t è definito in linux
- 23. Numero intero senza segno a 1 byte C++
- 24. Trasmetti da size_t a int o iterazione con size_t?
- 25. Costante esadecimale senza segno in C?
- 26. Equivalente di atoi per interi senza segno
- 27. “Attenzione: il confronto è sempre vero”
- 28. Visualizzazione selezione elenco senza riempimento e senza segno di spunta
- 29. 'size_t' vs 'container :: size_type'
- 30. Fusioni ssize_t o size_t
Alcune citazioni da un documento standard per tutte le affermazioni riportate di seguito sarebbero buone. –
Non si tratta della dimensione, è come la si usa :) – ralphtheninja
C'è "ssize_t" per "una dimensione firmata" :) –