Die Bibliothek Boost.Integer bietet eine Headerdatei boost/cstdint.hpp
an, die spezialisierte Typen für Ganzzahlen definiert. Diese Definitionen stammen aus dem Standard C99. Es handelt sich hierbei um die 1999 verabschiedete Version des Standards zur Programmiersprache C. Da die erste Version des C++-Standards 1998 veröffentlicht wurde, fehlten die in C99 definierten Typen für Ganzzahlen im C++-Standard.
C99 definiert die Typen, die Sie im Folgenden kennenlernen werden, in der Headerdatei stdint.h
. Diese Headerdatei wurde in C++11 übernommen. In C++ heißt sie cstdint
. Wenn Ihre Entwicklungsumgebung C++11 unterstützt, können Sie auf cstdint
zugreifen und müssen boost/cstdint.hpp
nicht verwenden.
#include <boost/cstdint.hpp>
#include <iostream>
int main()
{
boost::int8_t i8 = 1;
std::cout << sizeof(i8) << '\n';
#ifndef BOOST_NO_INT64_T
boost::uint64_t ui64 = 1;
std::cout << sizeof(ui64) << '\n';
#endif
boost::int_least8_t il8 = 1;
std::cout << sizeof(il8) << '\n';
boost::uint_least32_t uil32 = 1;
std::cout << sizeof(uil32) << '\n';
boost::int_fast8_t if8 = 1;
std::cout << sizeof(if8) << '\n';
boost::uint_fast16_t uif16 = 1;
std::cout << sizeof(uif16) << '\n';
}
Die in boost/cstdint.hpp
definierten Typen stehen im Namensraum boost
zur Verfügung. Die Typen lassen sich in drei Kategorien einteilen:
Typen wie boost::int8_t
und boost::uint64_t
tragen die exakte Speichergröße im Namen. Während boost::int8_t
aus genau 8 Bits besteht, belegt boost::uint64_t
genau 64 Bits.
Typen wie boost::int_least8_t
und boost::uint_least32_t
bestehen aus mindestens so vielen Bits wie im Namen enthalten. So ist es möglich, dass die Speichergröße von boost::int_least8_t
bei mehr als 8 Bits und von boost::uint_least32_t
bei mehr als 32 Bits liegt.
Typen wie boost::int_fast8_t
und boost::uint_fast16_t
legen ebenfalls eine Mindestgröße fest. Ihre tatsächliche Speichergröße ist so gesetzt, dass Variablen dieser Typen schnell verarbeitet werden können. So gibt Beispiel 57.1 mit Visual C++ 2013 auf einem 64-Bit Windows 7-System erstellt für sizeof(uif16)
4
aus.
Beachten Sie, dass 64-Bit-Typen nicht auf allen Plattformen zur Verfügung stehen. Sie können über das Makro BOOST_NO_INT64_T
feststellen, ob 64-Bit-Typen fehlen.
#include <boost/cstdint.hpp>
#include <iostream>
int main()
{
boost::intmax_t imax = 1;
std::cout << sizeof(imax) << '\n';
std::cout << sizeof(UINT8_C(1)) << '\n';
#ifndef BOOST_NO_INT64_T
std::cout << sizeof(INT64_C(1)) << '\n';
#endif
}
Boost.Integer definiert mit boost::intmax_t
und boost::uintmax_t
zwei Typen, mit denen die größtmöglichen Ganzzahlen gespeichert werden können. boost::intmax_t
und boost::uintmax_t
basieren auf den größtmöglichen primitiven Typen, die auf einer Plattform zur Verfügung stehen. Wird Beispiel 57.2 mit Visual C++ 2013 kompiliert auf einem 64-Bit Windows 7-System ausgeführt, gibt sizeof(imax)
8
aus. Der größte Typ für Ganzzahlen belegt demnach 64 Bits.
Boost.Integer stellt außerdem Makros zur Verfügung, um Ganzzahlen als Literale mit bestimmten Typen zu verwenden. Wird in C++-Quellcode eine Ganzzahl niedergeschrieben, hat diese standardmäßig den Typ int
und belegt mindestens 4 Bytes. Makros wie UINT8_C
und INT64_C
ermöglichen es, eine Mindestgröße für eine Ganzzahl als Literal anzugeben. Beispiel 57.2 gibt für sizeof(UINT8_C(1))
mindestens 1
und für sizeof(INT64_C(1))
mindestens 8
aus.
Boost.Integer bietet neben boost/cstdint.hpp
weitere Headerdateien an. Diese stellen vorwiegend Klassen zur Verfügung, wie sie zur Template-Metaprogrammierung eingesetzt werden.