Урок 32. Фиксированный размер integers. Спор насчет unsigned

   ⁄ 

 Обновлено 17 Апр 2017

  ⁄   

В предыдущем уроке о целочисленных типах мы говорили, что C++ гарантирует только их минимальный размер — они могут занимать и больше, в зависимости от компилятора и/или архитектуры компьютера.

Почему размер целочисленных переменных не фиксированный?

Если говорить в общем, то всё началось еще с языка C, когда производительность имела первостепенное значение. В языке C решили намеренно оставить размер целочисленных переменных открытым для того, чтобы компилятор мог самостоятельно выбрать наиболее подходящий размер типа для определенной компьютерной архитектуры.

Разве это не глупо?

Да! Для программистов, это несколько нелепо иметь дело с переменными, размер которых может варьироваться в зависимости от определенной архитектуры.

Фиксированные целочисленные типы

Дабы разрешить вопрос кроссплатформенности, в C99 определили набор целочисленных типов фиксированной величины (fixed-width integers), которые гарантированно имеют один размер на любой архитектуре. Реализация находится в заголовке stdint.h.

Название Тип Диапазон
int8_t 1 байт signed от -128 до 127
uint8_t 1 байт unsigned от 0 до 255
int16_t 2 байта signed от -32 768 до 32 767
uint16_t 2 байта unsigned от 0 до 65 535
int32_t 4 байта signed от -2 147 483 648 до 2 147 483 647
uint32_t 4 байта unsigned от 0 до 4 294 967 295
int64_t 8 байтов signed от -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807
uint64_t 8 байтов unsigned от 0 до 18 446 744 073 709 551 615

В C++ это приняли, как часть C++ 11. Доступ к ним осуществляется через подключение заголовка cstdint, где они определены в пространстве имен std. Например:

Хотя фиксированные целочисленные типы были приняты только в C++ 11, некоторые старые компиляторы предоставляют доступ к ним через добавление заголовка stdint.h. Visual Studio 2005 и 2008 не подключают stdint.h, но 2010 подключает.

Если ваш компилятор не поддерживает cstdint или stdint.h, то вы можете скачать кроссплатформенный заголовок pstdint.h. Просто подключите файл pstdint.h к вашему проекту, и он самостоятельно определит размер фиксированных целочисленных типов для вашей платформы.

Некоторые компиляторы определяют свою собственную версию фиксированных целочисленных типов. Например, в Visual Studio есть типы __int8, __int16 и т.д. Вы должны их избегать, как чуму.

Споры по поводу unsigned

Многие разработчики (и даже большие организации, такие как Google) считают, что программисты должны избегать использование целочисленных типов unsigned вообще. В основном из-за неожиданного поведения, которое может возникнуть при смешивании целочисленных типов signed и unsigned в программе.

Рассмотрим следующий фрагмент кода:

Что произойдет в этом случае? -1 преобразуется в другое большое число (вероятно, 4294967295). Но хуже то, что нет способа это предотвратить. C++ будет свободно конвертировать числа между типами unsigned и signed, но без проверки по диапазонам типа данных, чтобы убедиться, что не произойдет переполнение.

Многие современные языки программирования (например, Java и C#) либо не включают типы unsigned, либо ограничивают их использование. Бьёрн Страуструп, создатель C++, сказал: «Использование типов unsigned вместо signed, чтобы получить еще один бит для представления положительных целых чисел, почти никогда не является хорошей идеей».

Это не означает, что вы должны избегать типы unsigned вообще — но если вы их используете, используйте уж только там, где они действительно нужны и имеют смысл, а также позаботьтесь о том, чтобы не допустить смешивание чисел (как в примере выше).

Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (18 оценок, среднее: 4,94 из 5)
Загрузка...
Поделиться в:
Подписаться на обновления:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *