Целое (тип данных)

Целое (тип данных)

Целое, целочисленный тип данных (англ. 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).
  • Словесное представление (в том числе сумма прописью) — число представляется словами на указанном натуральном языке.

Перечислимый тип

К целым относится также перечислимый тип. Переменные перечислимого типа принимают конечный заранее заданный набор значений. Размер набора не определяется числом байтов, используемых для представления целочисленных значений переменных такого типа.

См. также

Примечания

  1. Бен-Ари, 2000, с. 54
  2. Урок 7. Расширенные арифметические операции с целыми числами, Низкоуровневое программирование, СУНЦ НГУ
  3. Types, Values and Variables, Java Languaege Specification, 2-nd ed.
  4. [1], Нужны ли беззнаковые целые?
  5. 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

Wikimedia Foundation. 2010.

Смотреть что такое "Целое (тип данных)" в других словарях:

  • Тип данных — (встречается также термин вид данных)  фундаментальное понятие теории программирования. Тип данных определяет множество значений, набор операций, которые можно применять к таким значениям и, возможно, способ реализации хранения значений и… …   Википедия

  • Тип возвращаемой переменной — В области программирования тип возвращаемой переменной (англ. return type) определяет и накладывает ограничения на тип данных, возвращаемых методом или функцией. Во многих языках программирования (особенно это касается языков со статической… …   Википедия

  • Целое число — Множество целых чисел  , определяется как замыкание множества натуральных чисел относительно арифметических операций сложения (+) и вычитания (−). Таким образом, сумма, разность и произведение двух целых чисел дает снова целые числа. Оно… …   Википедия

  • Типизация данных — Тип данных  фундаментальное понятие теории программирования. Тип данных определяет множество значений, набор операций, которые можно применять к таким значениям, и, возможно, способ реализации хранения значений и выполнения операций. Любые… …   Википедия

  • Валютный тип — Тип данных Содержание 1 История 2 Определение 3 Необходимость использования типов данных …   Википедия

  • Перечисляемый тип — (сокращённо перечисление, англ. enumeration, enumerated type)  в программировании тип данных, чьё множество значений представляет собой ограниченный список идентификаторов. Содержание 1 Описание и использование 2 …   Википедия

  • Типы данных — В этой статье перечисляются типы данных, о самом понятии см тип данных В различных операционных системах, языках программирования, спецификациях форматов данных фигурируют различные символические обозначения для типов данных. Часть из них… …   Википедия

  • Логический тип — По техническим причинам Bool перенаправляется сюда. О Bool можно прочитать здесь: stdbool.h. Логический, булев (англ. Boolean или logical data type) тип данных  примитивный тип данных в информатике, которые могут принимать два возможных …   Википедия

  • Перечислимый тип — Перечисляемый тип (сокращённо перечисление, англ. enumeration, enumerated type)  в программировании тип данных, чьё множество значений представляет собой ограниченный список идентификаторов. Содержание 1 Описание и использование 2 Реализация 3 …   Википедия

  • Булевский тип — Логический (булев) тип данных примитивный тип данных в информатике, которые могут принимать два возможных значения, иногда называемых правдой и ложью. Присутствует в подавляющем большинстве языков программирования как самостоятельная сущность или …   Википедия


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»

We are using cookies for the best presentation of our site. Continuing to use this site, you agree with this.