Esiste un typedef standard (o MSVC proprietario) per un tipo firmato che può contenere l'intervallo completo dei valori size_t
? Cioè su un sistema a 64 bit, sarebbe un intero con segno a 128 bit.typedef per un tipo firmato che può contenere un size_t?
risposta
In generale non è possibile definire un tipo di questo tipo. È perfettamente legale per un'implementazione rendere size_t
il più grande tipo non firmato supportato, il che significherebbe che nessun tipo firmato può contenere tutti i suoi valori.
ptrdiff_t
non è necessariamente sufficientemente ampio. È il risultato della sottrazione di due puntatori, ma non c'è nulla che dice che una sottrazione del puntatore non possa traboccare. Vedere la sezione 5.7 dello standard ++ C:
Quando due puntatori a elementi dello stesso oggetto array vengono sottratti, il risultato è la differenza tra gli indici dei due elementi di matrice . Il tipo del risultato è un tipo integrale con firma firmato definito dall'implementazione; questo tipo deve essere dello stesso tipo definito come
std::ptrdiff_t
nell'intestazione<cstddef>
(18.2). Come con qualsiasi altro overflow aritmetico , se il risultato non si adatta nello spazio fornito, il comportamento non è definito.
Il più grande tipo firmato è intmax_t
, definito nel <stdint.h>
o <cstdint>
. Questa è una funzionalità C99 e C++ 11 è stato il primo standard C++ a incorporare la libreria standard C99, quindi il compilatore potrebbe non supportarlo (e probabilmente MSVC non lo supporta). Se c'è un tipo firmato abbastanza largo da contenere tutti i possibili valori di tipo size_t
, allora intmax_t
è (anche se lo potrebbe essere un tipo firmato più stretto che si qualifica anche).
È inoltre possibile utilizzare long long
, che è un tipo firmato garantito almeno da 64 bit (e molto probabilmente uguale a intmax_t
). Anche se non è sufficientemente ampio da contenere tutti i possibili valori di tipo size_t
, sarà quasi certo che tutti i valori rilevanti sono pertinenti a size_t
, a meno che l'implementazione non supporti effettivamente oggetti più grandi di 8 exabyte (ovvero 8192 petabyte o 8388608 terabyte).
(Nota, sto utilizzando le definizioni binarie di "volta a valutare", "peta-", e "tera-", che sono di dubbia validità.)
* "e MSVC molto probabilmente non" * - Come nota a margine, i nuovi tipi di interi erano effettivamente una delle poche funzionalità di C++ 11 che la libreria standard * MSVC * aveva da * 2010 *. –
Inoltre, se non si è sicuri delle dimensioni che si otterranno su una determinata piattaforma, aggiungere un: 'static_assert (sizeof (intmax_t)> sizeof (size_t)," Impossibile ottenere un tipo firmato che garantisca una dimensione_t ");' così il compilatore ti avviserà se stai per entrare nei guai. –
presumo avete bisogno di questo tipo per un po ' tipo di aritmetica dei puntatori. È molto improbabile che tu abbia bisogno di nient'altro che lo std::ptrdiff_t
. L'unico caso in cui questo svolgerà un ruolo su una macchina moderna è quando ci si trova in modalità a 32 bit e si sta lavorando su un set di dati con più di 2^31 byte. (Questo non sarà nemmeno possibile su Windows senza un lavoro speciale.) Non sarai in grado di utilizzare due array di quella dimensione allo stesso tempo. In questo caso, probabilmente dovresti comunque lavorare in modalità 64 bit.
In modalità a 64 bit molto probabilmente non sarà un problema per i prossimi 40 anni circa con l'attuale velocità di sviluppo della memoria. E quando si diventa un problema, quindi compilare il codice in modalità 128-bit e continuerà a correre. ;)
Se si desidera un tipo standard che può contenere il valore massimo del sistema, forse il <cstdint>
(dal C++ 11) potrebbe aiutare.
C'è un typedef in quell'intestazione che contiene il tipo intero di larghezza massima, il tipo è intmax_t
. Lo intmax_t
per gli interi con segno e lo uintmax_t
per quelli senza segno è il più grande intero pienamente supportato dall'architettura.
Quindi, supponiamo che sei in un'architettura a 64 bit, la seguente istruzione:
std::cout << "intmax_t is same int64_t? "
<< (std::is_same<intmax_t, int64_t>::value ? "Yes" : "No");
uscita sarà:
intmax_t è lo stesso int64_t? Sì
Spero che aiuti.
- 1. Un campo tabella può contenere un trattino?
- 2. Perché la conversione da un size_t a un non firmato int mi dà un avvertimento?
- 3. Un ListView può contenere frammenti
- 4. Un SVG può contenere audio utilizzando javascript?
- 5. Quanti caratteri può contenere un StringBuilder Java?
- 6. Un file Proc può contenere commenti?
- 7. Un assembly C# .dll può contenere un punto di ingresso?
- 8. size_t vs. uintptr_t
- 9. typedef equivalente per int
- 10. Un URL "SEO Friendly" può contenere un ID univoco?
- 11. Un URL può contenere un punto e virgola?
- 12. Come verificare se un tipo è un typedef di int
- 13. qualcuno può spiegare perché il tipo size_t viene utilizzato con un esempio?
- 14. Inoltro che dichiara un typedef per una classe modello
- 15. C'è un limite su quanto JSON può contenere?
- 16. Lo standard C++ garantisce che std :: uintmax_t possa contenere tutti i valori di std :: size_t?
- 17. Il tipo di dati Postgres può contenere valori firmati NUMERIC?
- 18. Che tipo di dati è size_t in possesso?
- 19. C++: sovraccarico ambigous può essere risolto se typedef sono sostituiti
- 20. tipo typedef enum come chiave per NSDictionary?
- 21. Colonna Datagrid può contenere un tipo di controllo diffterente in una riga diversa
- 22. GroupBox in WPF può contenere solo un elemento?
- 23. In che modo il computer distingue un intero è firmato o non firmato?
- 24. Un valore JSON può contenere una stringa multilinea
- 25. C'è un equivalente a size_t in llvm
- 26. Un indirizzo email può contenere caratteri internazionali (non inglesi)?
- 27. Come dichiarare una variabile che può contenere solo classi enumerate?
- 28. Modo corretto per restituire un codice di errore per la funzione che restituisce size_t
- 29. Un typedef per sé ha qualche effetto?
- 30. Rails: Trovare massimo di array che può contenere zero
'unsigned long long' –
Oops typo nel titolo. Stavo chiedendo di un tipo firmato. – japreiss
Nella remota possibilità che il motivo per cui vuoi un tipo firmato sia sovraccarico/escape con un significato speciale, potresti considerare il wrapper 'boost :: optional <>'. –