Стандартная библиотека 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>типы, определённые в.

Другие расширения