Целочисленные типы фиксированного размера

Вместо указания конкретного целочисленного типа можно воспользоваться макроопределениями __int8, __int16, __int32 и __int64. Определения макросов:

#define __int8 char
#define __int16 short
#define __int32 int
#define __int64 long long

Пример объявления переменных:

__int8  x = 10;
__int16 y = 20;
__int32 z = 30;
__int64 k = 40LL;

Кроме того, в заголовочном файле stdint.h объявлены знаковые типы фиксированной длины int8_t, int16_t, int32_t и int64_t, а также беззнаковые uint8_t, uint16_t, uint32_t и uint64_t (полный список доступных типов смотрите в заголовочном файле):

#include <stdint.h>
typedef signed char int8_t;
typedef unsigned char   uint8_t;
typedef short  int16_t;
typedef unsigned short  uint16_t;
typedef int  int32_t;
typedef unsigned   uint32_t;
typedef long long  int64_t;
typedef unsigned long long   uint64_t;

Заголовочный файл stdint.h содержит также макроопределения с допустимыми диапазонами значений для этих типов:

#define INT8_MIN (-128)
#define INT8_MAX 127
#define INT16_MIN (-32768)
#define INT16_MAX 32767
#define INT32_MIN (-2147483647 - 1)
#define INT32_MAX 2147483647
#define INT64_MIN  (-9223372036854775807LL - 1)
#define INT64_MAX 9223372036854775807LL

#define UINT8_MAX 255
#define UINT16_MAX 65535
#define UINT32_MAX 0xffffffffU  /* 4294967295U */
#define UINT64_MAX 0xffffffffffffffffULL /* 18446744073709551615ULL */

Пример:

using namespace std;
// #include <stdint.h> или #include <inttypes.h>
int8_t min = INT8_MIN;
int8_t max = INT8_MAX;
uint8_t umax = UINT8_MAX;
cout << static_cast<int>(min) << endl;       // -128
cout << static_cast<int>(max) << endl;       // 127
cout << static_cast<unsigned>(umax) << endl; // 255

При использовании типов с фиксированной шириной следует учитывать, что в разных компиляторах объявление типа может быть разным. Гарантируется только диапазон значений для типа, но, например, при объявлении int32_t вместо типа int может быть использован тип long. Спецификаторы у этих типов разные. Чтобы в функции printf() правильно указать спецификатор следует воспользоваться следующими макроопределениями (полный список макроопределений смотрите в заголовочном файле inttypes.h):

#include <inttypes.h>
#define PRId8 "d"
#define PRId16 "d"
#define PRId32 "d"
#define PRId64 "lld"

#define PRIu8 "u"
#define PRIu16 "u"
#define PRIu32 "u"
#define PRIu64 "llu"

Пример указания спецификатора при выводе значения типа int64_t:

// #include <inttypes.h>
int64_t x = 9223372036854775807LL;
printf("%" PRId64, x); // 9223372036854775807

Учебник C++ (MinGW-W64)
Учебник C++ (MinGW-W64) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов