Die Boost C++ Bibliotheken

Kapitel 57. Boost.Integer

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.

Beispiel 57.1. Typen für Ganzzahlen mit Angabe von Bits
#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:

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.

Beispiel 57.2. Weitere spezialisierte Typen für Ganzzahlen
#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.