C++ 標準ライブラリ<cstdint>

<cstdint>これは C++11 で導入されたヘッダファイルであり、一連の固定幅整数型を定義します。これらの型は、異なるプラットフォーム上でも同じサイズと表現範囲を持ちます。

なぜ使うのか<cstdint>

C++ では、標準整数型(たとえばint、longなど)のサイズと表現範囲は、コンパイラやプラットフォームに依存します。これにより、異なるプラットフォームでコンパイルされたプログラムの動作が一貫しない可能性があります。使用<cstdint>に定義された固定幅整数型を使用すると、これらの問題を回避できます。それらはすべてのプラットフォームで同じサイズと表現範囲を持つためです。

定義と構文

<cstdint>以下の整数型が定義されています:

  • int8_t:8ビット符号付き整数
  • uint8_t:8ビット符号なし整数
  • int16_t:16ビット符号付き整数
  • uint16_t:16ビット符号なし整数
  • int32_t:32ビット符号付き整数
  • uint32_t:32ビット符号なし整数
  • int64_t:64ビット符号付き整数
  • uint64_t:64ビット符号なし整数

さらに、最大幅の整数型も定義されています:

  • intmax_t:最大幅の符号付き整数
  • uintmax_t:最大幅の符号なし整数

また、ビット操作用の型:

  • intptr_t:ポインタの値を格納できる十分に大きな符号付き整数
  • uintptr_t:ポインタの値を格納できる十分に大きな符号なし整数

例

以下は<cstdint>の簡単な例で、これらの型を宣言して使用する方法を示しています。

例

#include <iostream>
#include <cstdint>

int main() {
    // 固定幅の整数型を宣言する
    int8_t a = -128; // 最小値
    uint8_t b = 255; // 最大値
    int16_t c = -32768;
    uint16_t d = 65535;
    int32_t e = -2147483648;
    uint32_t f = 4294967295U; // U サフィックスを使用して符号なし定数を表す
    int64_t g = -9223372036854775807LL; // LL サフィックスを使用して long long 型定数を表す
    uint64_t h = 18446744073709551615ULL; // ULL サフィックスを使用して unsigned long long 型定数を表す

    // 結果を出力する
    std::cout << "int8_t: " << static_cast<int>(a) << std::endl;
    std::cout << "uint8_t: " << static_cast<unsigned int>(b) << std::endl;
    std::cout << "int16_t: " << c << std::endl;
    std::cout << "uint16_t: " << d << std::endl;
    std::cout << "int32_t: " << e << std::endl;
    std::cout << "uint32_t: " << f << std::endl;
    std::cout << "int64_t: " << g << std::endl;
    std::cout << "uint64_t: " << h << std::endl;

    return 0;
}

出力結果:

int8_t: -128
uint8_t: 255
int16_t: -32768
uint16_t: 65535
int32_t: -2147483648
uint32_t: 4294967295
int64_t: -9223372036854775807
uint64_t: 18446744073709551615

固定幅整数型

固定幅整数型は、変数が固定の幅を持つことを保証します。これは、データサイズとレイアウトを正確に制御する必要がある場合に非常に役立ちます。それらの命名形式はintN_tとuintN_t、ここでNはビット幅を表します。

  • int8_t, int16_t, int32_t, int64_t:符号付き固定幅整数型。
  • uint8_t, uint16_t, uint32_t, uint64_t:符号なし固定幅整数型。

例

#include <cstdint>
#include <iostream>

int main() {
    int8_t a = -128;
    uint8_t b = 255;
    int32_t c = 2147483647;
    uint64_t d = 18446744073709551615U;

    std::cout << "a = " << static_cast<int>(a) << std::endl;
    std::cout << "b = " << static_cast<unsigned>(b) << std::endl;
    std::cout << "c = " << c << std::endl;
    std::cout << "d = " << d << std::endl;

    return 0;
}

最小幅整数型

最小幅整数型は、変数が指定されたビット幅を少なくとも持つことを保証します。これは、最小ビット幅の保証が必要だが、ビット幅を正確に制御する必要がない場合に非常に役立ちます。それらの命名形式はint_leastN_tとuint_leastN_t。

  • int_least8_t, int_least16_t, int_least32_t, int_least64_t:符号付き最小幅整数型。
  • uint_least8_t, uint_least16_t, uint_least32_t, uint_least64_t:符号なし最小幅整数型。

例

#include <cstdint>
#include <iostream>

int main() {
    int_least8_t a = -128;
    uint_least8_t b = 255;
    int_least32_t c = 2147483647;
    uint_least64_t d = 18446744073709551615U;

    std::cout << "a = " << static_cast<int>(a) << std::endl;
    std::cout << "b = " << static_cast<unsigned>(b) << std::endl;
    std::cout << "c = " << c << std::endl;
    std::cout << "d = " << d << std::endl;

    return 0;
}

最速幅整数型

最速幅整数型は、変数が指定されたビット幅を少なくとも持ち、かつ特定のシステム上で可能な限り高速であることを保証します。それらの命名形式はint_fastN_tとuint_fastN_t。

  • int_fast8_t, int_fast16_t, int_fast32_t, int_fast64_t:符号付き最速幅整数型。
  • uint_fast8_t, uint_fast16_t, uint_fast32_t, uint_fast64_t:符号なし最速幅整数型。

例

#include <cstdint>
#include <iostream>

int main() {
    int_fast8_t a = -128;
    uint_fast8_t b = 255;
    int_fast32_t c = 2147483647;
    uint_fast64_t d = 18446744073709551615U;

    std::cout << "a = " << static_cast<int>(a) << std::endl;
    std::cout << "b = " << static_cast<unsigned>(b) << std::endl;
    std::cout << "c = " << c << std::endl;
    std::cout << "d = " << d << std::endl;

    return 0;
}

特殊型

  • intmax_t:表現できる最大の符号付き整数型。
  • uintmax_t:表現できる最大の符号なし整数型。
  • intptr_t:ポインタを格納するのに十分な大きさの符号付き整数型。
  • uintptr_t:ポインタを格納するのに十分な大きさの符号なし整数型。

例

#include <cstdint>
#include <iostream>

int main() {
    intmax_t max_int = INTMAX_MAX;
    uintmax_t max_uint = UINTMAX_MAX;
    intptr_t ptr_int = reinterpret_cast<intptr_t>(&max_int);
    uintptr_t ptr_uint = reinterpret_cast<uintptr_t>(&max_uint);

    std::cout << "max_int = " << max_int << std::endl;
    std::cout << "max_uint = " << max_uint << std::endl;
    std::cout << "ptr_int = " << ptr_int << std::endl;
    std::cout << "ptr_uint = " << ptr_uint << std::endl;

    return 0;
}

境界値マクロ

<cstdint>これらの型の境界値を表すマクロ群も定義されています。

  • INT8_MIN, INT8_MAX, UINT8_MAX
  • INT16_MIN, INT16_MAX, UINT16_MAX
  • INT32_MIN, INT32_MAX, UINT32_MAX
  • INT64_MIN, INT64_MAX, UINT64_MAX

例

#include <cstdint>
#include <iostream>

int main() {
    std::cout << "INT8_MIN = " << static_cast<int>(INT8_MIN) << std::endl;
    std::cout << "INT8_MAX = " << static_cast<int>(INT8_MAX) << std::endl;
    std::cout << "UINT8_MAX = " << static_cast<unsigned>(UINT8_MAX) << std::endl;

    std::cout << "INT32_MIN = " << INT32_MIN << std::endl;
    std::cout << "INT32_MAX = " << INT32_MAX << std::endl;
    std::cout << "UINT32_MAX = " << UINT32_MAX << std::endl;

    return 0;
}

<cstdint>異なるプラットフォーム上で同じサイズと表現範囲を持つ一連の固定幅整数型を提供します。これらの型を使用すると、コードの移植性と予測可能性を向上させることができます。クロスプラットフォームの C++ プログラムを書く際には、使用を推奨します。<cstdint>中で定義された型。

その他の拡張