Soru C ++ standardı std :: uintmax_t'ın std :: size_t'nin tüm değerlerini tutabileceğini garanti eder mi?


C ++ standart garantisi (açık bir şekilde belirterek veya dolaylı olarak mantıksal kesintiyle) std::uintmax_t tüm değerlerini tutabilir std::size_t?

Ya da mümkün mü std::numeric_limits<std::size_t>::max() daha büyük olmak std::numeric_limits<std::uintmax_t>::max()?


21
2018-04-04 23:04


Menşei


Eminim........... - David
GCC'nin eski versiyonlarında, std::size_t (yanlış) imzalandı. Öyleyse: her zaman değil, ama yine de benzersiz bir değerle eşleşir, böylece hiçbir sorun olmadan geri dönebilirsiniz. Muhtemelen bu kadar size_t daha kısa uintmax_t - Dave


Cevaplar:


Evet.

size_t herhangi bir nesnenin boyutunu içerecek kadar büyük imzasız bir tamsayı türü olarak tanımlanır. uintmax_t herhangi bir işaretsiz tamsayı türünün herhangi bir değerini depolayabilmek için tanımlanır. Eğer öyleyse size_t saklayabilir uintmax_t saklayabilir.

Tanımı size_t C ++ 11 §18.2'den:

Size_t türü, boyutu herhangi bir nesnenin bayt cinsinden içermesi için yeterince büyük olan, uygulama tarafından tanımlanmamış işaretsiz bir tamsayı türüdür.

Tanımı uintmax_t C99 §7.18.1.5'den (normatif referansla C ++'ye dahil edilmiştir):

Aşağıdaki tür, herhangi bir değeri temsil edebilen işaretsiz bir tamsayı türünü belirtir.   herhangi bir imzasız tamsayı türü:

uintmax_t

29
2018-04-04 23:08



Sağ. Tarafından tanım, uintmax_t olduğu en büyük işaretsiz tamsayı türü ve size_t gibi bir işaretsiz tamsayı türü - kesinti ile, bunu söyleyebiliriz uintmax_t  şart tüm değerlerini tutabilmek size_t. - Xeo
Birisi bunun için C99 bölüm numarasını bulabilir mi uintmax_t benim için tanım? Bende bir kopyası yok. Teşekkürler. - Joseph Mansfield
C99’da Bölüm 7.18.1.5 (C2011’de 7.20.1.5). - Daniel Fischer
@DanielFischer Teşekkürler! - Joseph Mansfield
@sftrabbit: Kesin cevabınız için teşekkür ederim. Tam olarak aradığım şey. - JohnCand