Полезные псевдонимы в C++
В стандартной библиотеке C++ существует много псевдонимов, которые удобно использовать в распространённых случаях. Сегодня мы рассмотрим псевдонимы целочисленных типов: uint8_t, uint16_t, uint32_t, uint64_t, int8_t, int16_t, int32_t, int64_t, size_t, ptrdiff_t.
Числа в названиях означают число разрядов, используемых для представления числа. Так, uint16_t означает беззнаковое 16-разрядное целое число (для хранения используется 2 байта); int32_t — целое знаковое 32-разрядное число (для хранения используется 4 байта).
О том, для чего используются эти типы читайте ниже.
Псевдонимы беззнаковых целочисленных типов
К псевдонимам беззнаковых типов относятся:
— uint8_t;
— uint16_t;
— uint32_t;
— uint64_t;
— size_t
uint8_t как правило представляет unsigned char, uint16_t — unsigned short, uint32_t — unsigned (или unsigned long), uint64_t — unsigned long long. На разных платформах реализация может отличаться, но при этом гарантируется, что для представления будет использоваться беззнаковый тип с заданной разрядностью.
О псевдониме size_t читайте в предыдущей нашей статье.
Псевдонимы знаковых целочисленных типов
— int8_t;
— int16_t;
— int32_t;
— int64_t;
— ptrdiff_t
int8_t как правило представляет signed char, int16_t — short, int32_t — int (или long), int64_t — long long. На разных платформах реализация может отличаться, но при этом также гарантируется, что для представления будет использоваться знаковый тип с заданной разрядностью.
ptrdiff_t по разрядности аналогичен size_t, но в отличие от него — знаковый. Обычно используется при работе с указателями — для хранения разности указателей или расстояния, на которое следует переместить указатель.
Где используются такие псевдонимы?
О size_t подробности использования смотрите в нашей предыдущей статье.
ptrdiff_t, как было подчёркнуто выше, в основном используется в арифметике указателей.
Остальные указанные псевдонимы в основном используются, когда требуются чёткие требования по размеру переменной в памяти. Также, они полезны для кроссплатформенных приложений (ведь на разных платформах такие типы, как short, long, int и прочие могут иметь разную разрядность, а зачастую от неё зависит функционирование приложения — так как от разрядности зависит наибольшее значение, которое можно хранить в переменной).
Особенности использования
С псевдонимами uint8_t и int8_t следует работать внимательно, помня что они на самом деле представляют unsigned char и signed char соответственно. Поэтому при выводе их на консоль:
uint8_t value = 32;
std::cout < < value;
будет выведен символ пробела (обычно; всё зависит от особенности кодировки символов на Вашей платформе), а не значение 32. Ведь этот код эквивалентен следующему:
unsigned char value = 32;
std::cout < < value;
Чтобы правильно вывести такое значение. следует написать:
uint8_t value = 32;
std::cout < < static_cast<int>(value);
Также, можно написать так:
uint8_t value = 32;
std::cout < < int(value);
(но такой подход уже менее профессионален, компиляторы как правило в таком случае выдают предупреждение).
Здесь тип unsigned char приводится к int и на экран выводится 32.
То же касается и int8_t.
Для остальных типов такие ухищрения не требуются.
Если Вы не знаете что такое static_cast, то для Вас будет наша следующая статья, в которой мы рассмотрим приведение типов.
