2013-04-04 10 views
19

Czy standardowa gwarancja C++ (przez jawne stwierdzenie lub domyślnie przez dedukcję logiczną), że std::uintmax_t może zawierać wszystkie wartości std::size_t?Czy standard C++ gwarantuje, że std :: uintmax_t może przechowywać wszystkie wartości std :: size_t?

Czy jest możliwe, aby std::numeric_limits<std::size_t>::max() był większy niż std::numeric_limits<std::uintmax_t>::max()?

+0

Jestem pewien ........... – David

+0

w starych wersjach GCC, 'std :: size_t' jest (niesłusznie) podpisane. A więc: nie zawsze, ale nadal będzie odwzorowywany na unikalną wartość, dzięki czemu będziesz mógł wrócić bez problemu. Bardziej prawdopodobne jest to, że 'size_t' jest krótsze niż' uintmax_t' – Dave

Odpowiedz

27

Tak.

size_t jest zdefiniowany jako liczba całkowita bez znaku, wystarczająco duża, aby zawierać rozmiar dowolnego obiektu. uintmax_t jest zdefiniowany, aby móc przechowywać dowolną wartość dowolnego typu liczby całkowitej bez znaku. Więc jeśli size_t może go zapisać, może go zapisać .

Definicja size_t spośród takich jak C++ 11 §18.2:

typu size_t jest realizacja zdefiniowane unsigned całkowita, która jest wystarczająco duża, aby pomieścić rozmiar bajtów każdego przedmiotu.

Definicja uintmax_t od C99 §7.18.1.5 (to jest w C++ przez odniesienie normatywne)

są następujące typy wyznacza unsigned całkowitą może przyjmować dowolną wartość każdej liczby całkowitej bez znaku Typ:

uintmax_t 
+6

Prawo. Przez * definicja *, 'uintmax_t' jest * największym * bez znaku typem całkowitym, a' size_t' jako * an * unsigned typem całkowitym - przez dedukcję możemy powiedzieć, że 'uintmax_t' * musi * być w stanie przechowywać wszystkie wartości' size_t'. – Xeo

+0

Czy ktoś mógłby znaleźć numer sekcji C99 dla tej definicji "uintmax_t" dla mnie? Nie mam ze sobą kopii. Dzięki. –

+4

Sekcja 7.18.1.5 w C99 (7.20.1.5 w C2011). –

Powiązane problemy