Целое (тип данных) | это... Что такое Целое (тип данных)? (original) (raw)
Целое, целочисленный тип данных (англ. Integer), в информатике — один из простейших и самых распространённых типов данных в языках программирования. Служит для представления целых чисел. Множество чисел этого типа представляет собой подмножество бесконечного множества целых чисел, ограниченное максимальным и минимальным значениями. Если используется 32-разрядное машинное слово, то целое со знаком будет представлять значения от -2 147 483 648 (-231) до 2 147 483 647 (231-1); всего FFFF FFFF16 возможных значений.
Содержание
Представление
В памяти типовой компьютерной системы целое число представлено в виде цепочки битов фиксированного (кратного 8) размера. Эта последовательность нолей и единиц — ни что иное, как двоичная запись числа, поскольку обычно для представления чисел в современной компьютерной технике используется позиционный двоичный код. Диапазон целых чисел, как правило, определяется количеством байтов в памяти компьютера, отводимых под одну переменную.
Многие языки программирования предлагают выбор между короткими (англ. short), длинными (англ. long) и целыми стандартной длины. Длина стандартного целого типа, как правило, совпадает с размером машинного слова на целевой платформе. Для 16-разрядных операционных систем - этот тип (int) составляет 2 байта и совпадает с типом short int (можно использовать как short, опуская слово int), для 32-разрядных операционных систем он будет равен 4 байтам и совпадает с длинным целым long int (можно использовать как long, опуская слово int), и в этом случае будет составлять 4 байта. Короткое целое short int, для 16-разрядных операционных систем, 32-разрядных операционных систем, 64-разрядных операционных систем составляет — 2 байта. Также в некоторых языках может использоваться тип данных двойное длинное long long, который составляет 8 байт.
Для 64-разрядных операционных систем учитывая разность моделей данных (LP64, LLP64, ILP64), представление целого типа на разных моделях данных может отличаться между собой. Тип int и long может составлять как 4 так и 8 байт.
Стоит отметить, что каждый язык программирования реализует свою сигнатуру представления целых чисел, которая может отличатся от международных стандартов, но обязана его/их поддерживать. К примеру можно отнести кросс-платформенную библиотеку Qt, где целое представляется типом qintX и quintX, где X-8,16,32,64.
Целые типы подразделяются на беззнаковые (англ. unsigned) и знаковые (англ. signed).
Беззнаковые целые
Беззнаковые целые представляют только неотрицательные числа, при этом все разряды кода используются для представления значения числа и максимальное число соответствует единичным значениям кода во всех разрядах: 111...111. m-байтовая переменная целого типа без знака, очевидно, принимает значения от 0 до +28m-1.
В C и C++ для обозначения беззнаковых типов используется префикс unsigned. В C# в качестве показателя беззнаковости используется префикс u (англ. unsigned). Например, для объявления беззнакового целого, равного по размеру одному машинному слову используется тип uint.
Беззнаковые целые, в частности, используются для адресации памяти, представления символов.
Иногда в литературе[1] встречаются рекомендации не использовать тип беззнаковые целые, поскольку он может быть не реализован процессором компьютера, однако вряд ли этот совет следует считать актуальным — большинство современных процессоров (в том числе x86-совместимые[2]) одинаково хорошо работают как со знаковыми, так и с беззнаковыми целыми.
В некоторых языках, например java, беззнаковые целые типы (за исключением символьного) отсутствуют.[3]
Неправильное использование беззнаковых целых может приводить к неочевидным ошибкам из-за возникающего переполнения[4]. В приведённом ниже примере использование беззнаковых целых в цикле в C и C++ превращает этот цикл в бесконечный:
char ar[N]; for (unsigned int i = N-1; i >= 0; --i) ar[i] = i;
Целые со знаком
Существует несколько различных способов представления целых значений в двоичном коде в виде величины со знаком (англ.)русск.. В частности можно назвать прямой и обратный коды. Знак кодируется в старшем разряде числа: 0 соответствует положительным, а 1 отрицательным числам.
Могут быть использованы и более экзотические представления отрицательных чисел, такие, как, например, система счисления по основанию -2.[5]
Однако для большинства современных процессоров обычным представлением чисел со знаком является дополнительный код. Максимальное положительное число представляется двоичным кодом 0111...111, максимальное по модулю отрицательное кодом 1000...000, а код 111...111 соответствует -1. Такое представление чисел соответствует наиболее простой реализации арифметических логических устройств процессора на логических вентилях и позволяет использовать один и тот же алгоритм сложения и вычитания как для беззнаковых чисел, так и для чисел со знаком (отличие — только в условиях, при которых считается, что наступило арифметическое переполнение).
m-байтовая переменная целого типа со знаком принимает значения от −28m-1 до +28m-1-1.
Предельные значения для разных битностей
Ниже представлена таблица предельных значений десятичных чисел для разных битностей при кодировании дополнительным кодом. Не зависимо от битности у целых без знака минимальным значением всегда является 0 и поэтому оно не упомянуто. Справа от значения указано количество значащих цифр.
Бит | Максимальное без знака | Минимальное со знаком | Максимальное со знаком | |||
---|---|---|---|---|---|---|
Значение | Цифр | Значение | Цифр | Значение | Цифр | |
4 | 15 | 2 | -8 | 1 | 7 | 1 |
8 | 255 | 3 | -128 | 3 | 127 | 3 |
16 | 65 535 | 5 | -32 768 | 5 | 32 767 | 5 |
24 | 16 777 215 | 8 | -8 388 608 | 7 | 8 388 607 | 7 |
32 | 4 294 967 295 | 10 | -2 147 483 648 | 10 | 2 147 483 647 | 10 |
48 | 281 474 976 710 655 | 15 | -140 737 488 355 328 | 15 | 140 737 488 355 327 | 15 |
64 | 18 446 744 073 709 551 615 | 20 | -9 223 372 036 854 775 808 | 19 | 9 223 372 036 854 775 807 | 19 |
96 | 79 228 162 514 264 337 593 543 950 335 | 29 | -39 614 081 257 132 168 796 771 975 168 | 29 | 39 614 081 257 132 168 796 771 975 167 | 29 |
128 | 340 282 366 920 938 463 463 374 607 431 768 211 455 | 39 | -170 141 183 460 469 231 731 687 303 715 884 105 728 | 39 | 170 141 183 460 469 231 731 687 303 715 884 105 727 | 39 |
Операции над целыми
Арифметические операции
К целочисленным значениям применимы в первую очередь арифметические операции. Ниже приведены самые часто используемые (в скобках указаны их обозначения в различных языках программирования и им аналогичным средствах).
- Сравнение (англ. comparision). Здесь применимы соотношения «равно» («=»; «==»; «eq»), «не равно» («!=»; «<>»; «ne»), «больше» («>»; «gt»), «больше или равно» («>=»; «ge»), «меньше» («<»; «lt») и «меньше или равно» («<=»; «le»).
- Инкремент (англ. increment; «++») и декремент (англ. decrement; «--») — арифметическое увеличение или уменьшение числа на единицу. Выделено в отдельные операции из-за частого использования с переменными-счётчиками в программировании.
- Сложение (англ. addition; «+») и вычитание (англ. substraction; «-»).
- Умножение (англ. multiplication; «*»).
- Деление (англ. division; «/»; «\») и получение остатка от деления (англ. modulo; «%»). Некоторые процессоры (например, архитектуры x86) позволяют производить обе эти операции за одну инструкцию.
- Инверсия знака (англ. negotiation) и получение абсолютного значения (англ. absolute).
- Получение знака. Результатом такой операции обычно является 1 для положительных значений, -1 — для отрицательных и 0 — для нуля.
- Возведение в степень («^»).
В некоторых языках программирования для лаконичности есть операторы, которые позволяют производить арифметическую операцию с присвоением. Например, «+=» складывает текущее значение переменной слева с выражением справа и помещает результат в исходную переменную. Так же в некоторых языках и средах доступна совмещённая операция MulDiv, которая умножает на одно число, а потом делит результат на второе.
Обычно самыми дорогими по скорости операциями являются умножение и деление (получение остатка от деления).
В памяти компьютера для хранения целых чисел обычно отводится ячейки фиксированного объёма. Из-за этого операции увеличения и уменьшения значений могут приводить к переполнению, что оборачивается искажением результата. Некоторые языки программирования позволяют производит вызов исключения в таких случаях. Кроме этого можно определять поведение при переполнении:
- Циклическая операция (обычно происходит по умолчанию). Например, если сделать инкремент 8-битного беззнакового значения 255, то получится 0.
- Операция с насыщением. Если будет достигнут предел, то конечным значением будет это предельное. Например, если к 8-битному беззнаковому числу 250 прибавить 10, то получится 255. Сложение, вычитание и умножение с насыщением обычно применяется при работе с цветом.
Побитовые операции
Помимо математических, к целым числам применимы битовые операции, которые основаны на особенностях позиционного двоичного кодирования. Обычно они выполняются значительно быстрее арифметических операций и поэтому их используют как более оптимальные аналоги.
- Битовый сдвиг влево с дополнением нулями аналогичен умножению числа на степень двойки (количество бит сдвига соответствует степени двойки).
- Битовый сдвиг вправо аналогичен делению на степень двойки (количество бит сдвига соответствует степени двойки). Некоторые языки программирования и процессоры поддерживают арифметический сдвиг, который позволяет сохранять знак у целых со знаком (сохраняется значение старшего бита).
- У целых со знаком знак можно узнать по старшему биту (у отрицательных он установлен).
- Чтение и установка младшего бита позволяет управлять чётностью (у нечётных чисел он установлен).
- Побитовое «И» над определённым количеством младших бит позволяет узнать остаток от деления на степень двойки (степень соответствует количеству бит).
- Побитовое «ИЛИ» над определённым количеством младших бит и последующий инкремент округляет число на значение, равное степени двойки (степень соответствует количеству бит) — используется для выравнивания адресов и размеров на определённое значение.
Работа со строками
Довольно частыми операциями являются получение строки из числового значения во внутреннем представлении и обратно — число из строки. При преобразовании в строку обычно доступны средства задания форматирования в зависимости от языка пользователя.
Ниже перечислены некоторые из представлений чисел строкой.
- Десятичное число (англ. decimal). При получении строки обычно можно задать разделители разрядов, количество знаков (добавляются лидирующие нули если их меньше) и обязательное указание знака числа.
- Число в системе счисления, которое является степенью двойки. Самые частые: двоичное (binary англ. binary), восьмиричное (англ. octal) и шестнадцатиричное (англ. hexadecimal). При получении строки обычно можно задать разделители групп цифр и минимальное количество цифр (производится дополнение нулями если их меньше). Так как эти представления чаще всего используются в программировании, то здесь обычно доступны соответствующие опции. Например, указание префикса и постфикса для получения значения в соответствии с синтаксисом языка. Для 16-ричных актуально указание регистра символов, а так же обязательное добавление нуля, если первая цифра представлена буквой (чтобы число не определялось как строковый идентификатор).
- Римское число (англ. roman).
- Словесное представление (в том числе сумма прописью) — число представляется словами на указанном натуральном языке.
Перечислимый тип
К целым относится также перечислимый тип. Переменные перечислимого типа принимают конечный заранее заданный набор значений. Размер набора не определяется числом байтов, используемых для представления целочисленных значений переменных такого типа.
См. также
- Прямой код
- Обратный код
- Дополнительный код
- Арифметика произвольной точности
Примечания
- ↑ Бен-Ари, 2000, с. 54
- ↑ Урок 7. Расширенные арифметические операции с целыми числами, Низкоуровневое программирование, СУНЦ НГУ
- ↑ Types, Values and Variables, Java Languaege Specification, 2-nd ed.
- ↑ [1], Нужны ли беззнаковые целые?
- ↑ Hacker's Delight, 2004, с. 215-221
Литература
- Основные определения цифровой и микропроцессорной техники, Система дистанционного обучения СПбГУ ИТМО, Програмное обеспечение измерительных систем на базе универсальных компьютеров
- М. Бен-Ари. Глава 4. Элементарные типы данных // Языки программирования. Практический сравнительный анализ = Understanding Programming Language. — Москва: Мир, 2000. — С. 53-74. — 366 с. — ISBN 5-03-003314-9
- Теренс Пратт, Марвин Зелковиц. 5.2. Скалярные типы данных // Языки программирования. Разработка и реализация = Programming Language. Design and Implementation. — 4-th edition. — Питер, 2002. — С. 205-216. — 688 с. — ISBN 5-03-003314-9
- Генри Уоррен мл. Алгоритмические трюки для программистов = Hacker's Delight. — Вильямс, 2004. — 288 с. — ISBN 5-8459-0572-9
- Behrooz Parhami. Computer Arithmetic: Algorithms and Hardware Designs. — New York: Oxford University Press, 2000. — 510 p. — ISBN 0-19-512583-5
Типы данных | |
---|---|
Неинтерпретируемые | Бит • Ниббл • Байт • Трит • Трайт • Слово |
Числовые | Целый • С фиксированной запятой • С плавающей запятой • Рациональный • Комплексный • Длинный • Интервальный |
Текстовые | Символьный • Строковый |
Указатель | Адрес • Ссылка |
Композитные | Алгебраический тип данных (обобщённый) • Массив • Ассоциативный массив • Класс • Список • Кортеж • Объект • Option type • Product • Структура • Множество • Объединение (tagged) |
Другие | Логический • Низший тип • Коллекция • Перечисляемый тип • Исключение • First-class function • Opaque data type • Recursive data type • Семафор • Поток • Высший тип • Type class • Unit type • Void |
Связанные темы | Абстрактный тип данных • Структура данных • Интерфейс • Kind (type theory) • Примитивный тип • Subtyping • Шаблоны C++ • Конструктор типа • Parametric polymorphism |