В предыдущих статьях мной неоднократно утверждалось, что стандарт С++ гарантирует минимальный размер для целочисленных типов данных, но он может быть больше в зависимости от выбранной операционной системы.
Такое решение пришло в С++ из родительского языка С. В то время, возможность менять размеры целочисленных типов данных была важна для разработчиков компиляторов. Компьютеры были медленные и это был отличный вариант для повышения производительности при создании компилятора под конкретную архитектуру.
А что сейчас? Будем честными, но логически понятно, что любая программа, использующая диапазоны выше минимальных будет страдать плохой кроссплатформенной переносимостью. То есть, говоря проще: на одной архитектуре она работать будет, а на другой нет.
Для выхода из этого тупика разработчики С определили в стандарте С99 набор целочисленных типов фиксированной ширины.
Целочисленные типы данных фиксированной ширины
Определение для целочисленных типов данных фиксированной ширины:
- std::int8_t может хранить 1 байт со знаком, с диапазоном от -128 до 127, в некоторых системах обрабатывается компилятором как signed char.
- std::uint8_t может хранить 1 байт без знака, с диапазоном от 0 до 255, в некоторых системах обрабатывается компилятором как unsigned char.
- std::int16_t может хранить 2 байта со знаком, с диапазоном от -32 768 до 32 767.
- std::uint16_t может хранить 2 байта без знака, с диапазоном от 0 до 65 535.
- std::int32_t может хранить 4 байта со знаком, с диапазоном от -2 147 483 648 до 2 147 483 647.
- std::uint32_t может хранить 4 байта без знака, с диапазоном от 0 до 4 294 967 295.
- std::int64_t может хранить 8 байт со знаком, с диапазоном от -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807.
- std::uint64_t может хранить 8 байт без знака, с диапазоном от 0 до 18 446 744 073 709 551 615.
Чтобы получить доступ к этим целочисленным типам, включите заголовок <cstdint>
C++ утвердил целочисленные типы данных фиксированной ширины в стандарте С++11 и они решили проблему с кроссплатформенной переносимостью. Однако, образовались две другие проблемы:
1. Фиксированный тип на некоторых архитектурах работал медленнее чем широкий целочисленный тип данных. Это было связано с тем, что разные процессоры лучше обрабатывают разные целочисленные типы. Допустим вы используете фиксированный тип std::int16_t, а процессор лучше обрабатывает 32-битные целые числа. Получается вы снизили скорость своей программы, создав ненужное ограничение.
2. Снизилась портируемость кода. Код, в котором использовались std::int#_t мог просто не компилироваться в других системах. Проблема с компиляцией возникала из-за того, что типы фиксированной ширины могли существовать только в условиях существования базового типа, соответствующего их ширине и двоичной записи.
Получившиеся недостатки нужно было устранить и С++ два альтернативных варианта целочисленных типов, где вышеизложенные недостатки были нивелированы.
std::int_fast#_t и std::int_least#_t
Эти альтернативные наборы целочисленных типов были призваны обеспечить самые быстрые и самые наименьшие по размеру типы по запросу программиста.
std::int_fast#_t — дает возможность получить доступ к самому быстрому целочисленному типу со знаком шириной не менее # бит. Он реализуется так же как и обычные типы фиксированной ширины, через заголовок <cstdint> и использует запись std::uint_fast#_t для получения самого быстрого целочисленного типа без знака.
std::int_fast#_t решил вопрос снижения скорости работы программ при использовании стандартных фиксированных типов.
std::int_least#_t — предоставляет доступ к наименьшему по размеру типу со знаком, шириной не менее # бит. Он реализуется так же как обычные типы фиксированной ширины, через заголовок <cstdint> и использует запись std::uint_least#_t для получения наименьшего целочисленного типа без знака.
std::int_least#_t решил вопрос низкой портируемости целочисленных типов фиксированной ширины.
И...
Это все что я хотел бы рассказать вам о целочисленных типах данных. В следующей статье мы приступим к разбору типов данных с плавающей точкой.
Спасибо за уделенное моему каналу время. До встречи в следующем материале.
Подпишитесь, чтобы его не пропустить.
Оставляйте комментарии, если вам есть что сказать.