stringtranslate.com

Целое число (информатика)

В информатике целое число — это элемент интегрального типа данных , тип данных , представляющий некоторый диапазон математических целых чисел . Интегральные типы данных могут иметь разные размеры и могут содержать или не содержать отрицательные значения. Целые числа обычно представляются в компьютере как группа двоичных цифр (битов). Размер группировки варьируется, поэтому набор доступных размеров целых чисел различается между различными типами компьютеров. Аппаратное обеспечение компьютера почти всегда обеспечивает способ представления регистра процессора или адреса памяти в виде целого числа.

Ценность и представление

Значением элемента с целочисленным типом является соответствующее ему математическое целое число. Целочисленные типы могут быть беззнаковыми ( способными представлять только неотрицательные целые числа) или знаковыми (способными представлять также отрицательные целые числа). [1]

Целочисленное значение обычно указывается в исходном коде программы как последовательность цифр, опционально с префиксом + или −. Некоторые языки программирования допускают другие обозначения, такие как шестнадцатеричные (основание 16) или восьмеричные (основание 8). Некоторые языки программирования также допускают разделители групп цифр . [2]

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

Наиболее распространенным представлением положительного целого числа является строка битов , использующая двоичную систему счисления . Порядок байтов памяти , хранящих биты, варьируется; см . порядок байтов . Ширина , точность или разрядность [3] целочисленного типа — это количество бит в его представлении. Целочисленный тип с n битами может кодировать 2 n чисел; например, беззнаковый тип обычно представляет неотрицательные значения от 0 до 2 n −1. Иногда используются другие кодировки целочисленных значений в битовые шаблоны, например, двоично-десятичное кодирование или код Грея , или как печатные коды символов, такие как ASCII .

Существует четыре известных способа представления знаковых чисел в двоичной вычислительной системе. Наиболее распространенным является дополнение до двух , которое позволяет знаковому целочисленному типу с n битами представлять числа от −2 ( n −1) до 2 ( n −1) −1. Арифметика с дополнением до двух удобна, поскольку существует идеальное взаимно-однозначное соответствие между представлениями и значениями (в частности, нет отдельных +0 и −0), а также потому, что сложение , вычитание и умножение не нуждаются в различии между знаковыми и беззнаковыми типами. Другие возможности включают смещение двоичного типа , знаковую величину и дополнение до единиц .

Некоторые компьютерные языки определяют целочисленные размеры машинно-независимым способом; другие имеют различные определения в зависимости от размера слова базового процессора. Не все реализации языка определяют переменные всех целочисленных размеров, а определенные размеры могут даже не быть различными в конкретной реализации. Целое число в одном языке программирования может иметь другой размер в другом языке, на другом процессоре или в контексте выполнения с другой разрядностью; см. § Слова.

Некоторые старые компьютерные архитектуры использовали десятичные представления целых чисел, хранящиеся в двоично-десятичном формате (BCD) или другом формате. Эти значения обычно требуют размеров данных 4 бита на десятичную цифру (иногда называемую полубайтом ) , обычно с дополнительными битами для знака. Многие современные процессоры предоставляют ограниченную поддержку десятичных целых чисел как расширенного типа данных, предоставляя инструкции для преобразования таких значений в двоичные значения и обратно. В зависимости от архитектуры десятичные целые числа могут иметь фиксированные размеры (например, 7 десятичных цифр плюс знак, помещающиеся в 32-битное слово) или могут иметь переменную длину (до некоторого максимального размера цифры), обычно занимая две цифры на байт (октет).

Распространенные интегральные типы данных

Различные ЦП поддерживают различные типы интегральных данных. Обычно оборудование поддерживает как знаковые, так и беззнаковые типы, но только небольшой фиксированный набор ширины.

В таблице выше перечислены ширины целочисленных типов, которые поддерживаются на аппаратном уровне обычными процессорами. Языки программирования высокого уровня предоставляют больше возможностей. Обычно существует целочисленный тип «двойной ширины», который имеет вдвое больше бит, чем самый большой поддерживаемый аппаратно тип. Во многих языках также есть типы битовых полей (определенное количество бит, обычно ограниченное максимальной поддерживаемой аппаратно шириной) и диапазонные типы (которые могут представлять только целые числа в указанном диапазоне).

Некоторые языки, такие как Lisp , Smalltalk , REXX , Haskell , Python и Raku , поддерживают целые числа произвольной точности (также известные как целые числа бесконечной точности или bignums ). Другие языки, которые не поддерживают эту концепцию как конструкцию верхнего уровня, могут иметь библиотеки, доступные для представления очень больших чисел с использованием массивов меньших переменных, такие как класс BigInteger в Java или пакет " bigint " в Perl . [6] Они используют столько памяти компьютера, сколько необходимо для хранения чисел; однако компьютер имеет только конечный объем памяти, поэтому они также могут представлять только конечное подмножество математических целых чисел. Эти схемы поддерживают очень большие числа; например, один килобайт памяти может быть использован для хранения чисел длиной до 2466 десятичных цифр.

Тип Boolean или Flag — это тип, который может представлять только два значения: 0 и 1, обычно идентифицируемые как false и true соответственно. Этот тип может храниться в памяти с использованием одного бита, но часто ему дается полный байт для удобства адресации и скорости доступа.

Четырехбитное количество известно как nibble (когда едят, будучи меньше, чем bite ) или nybble (будучи игрой слов на форме слова byte ). Один nibble соответствует одной цифре в шестнадцатеричной системе и содержит одну цифру или код знака в двоично-десятичной системе.

Байты и октеты

Термин байт изначально означал «наименьшую адресуемую единицу памяти». В прошлом использовались 5-, 6-, 7-, 8- и 9-битные байты. Также были компьютеры, которые могли адресовать отдельные биты («машина с битовой адресацией»), или которые могли адресовать только 16- или 32-битные величины («машина с словарной адресацией»). Термин байт обычно вообще не использовался в связи с машинами с битовой и словарной адресацией.

Термин октет всегда относится к 8-битному количеству. Он в основном используется в области компьютерных сетей , где компьютеры с разной шириной байта могут взаимодействовать.

В современном использовании байт почти всегда означает восемь бит, поскольку все другие размеры вышли из употребления; таким образом, байт стал синонимом октета .

Слова

Термин «слово» используется для небольшой группы бит, которые обрабатываются одновременно процессорами определенной архитектуры . Таким образом, размер слова зависит от ЦП. Было использовано много различных размеров слов, включая 6-, 8-, 12-, 16-, 18-, 24-, 32-, 36-, 39-, 40-, 48-, 60- и 64-бит. Поскольку это архитектурно, размер слова обычно устанавливается первым ЦП в семействе, а не характеристиками более позднего совместимого ЦП. Значения терминов, полученных от слова , таких как длинное слово , двойное слово , четверное слово и полуслово , также различаются в зависимости от ЦП и ОС. [7]

Практически все новые процессоры для настольных ПК способны использовать 64-битные слова, хотя встроенные процессоры с 8- и 16-битным размером слова все еще распространены. 36-битная длина слова была распространена на заре компьютеров.

Одной из важных причин непереносимости программного обеспечения является неверное предположение, что все компьютеры имеют тот же размер слова, что и компьютер, используемый программистом. Например, если программист, использующий язык C, неправильно объявляет как int переменную, которая будет использоваться для хранения значений больше 2 15 −1, программа не будет работать на компьютерах с 16-битными целыми числами. Эта переменная должна была быть объявлена ​​как long , которая имеет не менее 32 бит на любом компьютере. Программисты также могут неправильно предполагать, что указатель можно преобразовать в целое число без потери информации, что может работать на (некоторых) 32-битных компьютерах, но не работать на 64-битных компьютерах с 64-битными указателями и 32-битными целыми числами. Эта проблема решена C99 в stdint.h в виде .intptr_t

Разрядность программы может относиться к размеру слова (или разрядности ) процессора, на котором она работает, или к ширине адреса памяти или указателя, которые могут различаться в зависимости от режима выполнения или контекста. Например, 64-разрядные версии Microsoft Windows поддерживают существующие 32-разрядные двоичные файлы, а программы, скомпилированные для x32 ABI Linux, работают в 64-разрядном режиме, но используют 32-разрядные адреса памяти. [8]

Стандартное целое число

Стандартный размер целого числа зависит от платформы.

В C он обозначается как int и должен быть не менее 16 бит. В системах Windows и Unix есть 32-битные int как на 32-битной, так и на 64-битной архитектурах.

Короткое целое число

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

В C он обозначается как short . Он должен быть не менее 16 бит и часто меньше стандартного целого числа, но это не обязательно. [9] [10] Соответствующая программа может предполагать, что она может безопасно хранить значения между −(2 15 −1) [11] и 2 15 −1, [12] но она не может предполагать, что диапазон не больше. В Java short всегда является 16-битным целым числом. В Windows API тип данных SHORT определяется как 16-битное знаковое целое число на всех машинах. [7 ]

Длинное целое число

Длинное целое число может представлять целое число , диапазон которого больше или равен диапазону стандартного целого числа на той же машине.

В C он обозначается как long . Он должен быть не менее 32 бит и может быть больше стандартного целого числа, а может и нет. Соответствующая программа может предполагать, что она может безопасно хранить значения между −(2 31 −1) [11] и 2 31 −1, [12] , но она не может предполагать, что диапазон не больше.

Длинный-длинный

В версии C99 языка программирования C и версии C++11 языка C++long long поддерживается тип, имеющий вдвое большую минимальную емкость, чем стандартный . longЭтот тип не поддерживается компиляторами, которые требуют, чтобы код C соответствовал предыдущему стандарту C++, C++03, поскольку тип long long не существовал в C++03. Для компилятора, совместимого с ANSI/ISO, должны быть выполнены минимальные требования для указанных диапазонов, то есть от −(2 63 −1) [11] до 2 63 −1 для знаковых и от 0 до 2 64 −1 для беззнаковых [12] ; однако расширение этого диапазона разрешено. [17] [18] Это может стать проблемой при обмене кодом и данными между платформами или при прямом доступе к оборудованию. Таким образом, существует несколько наборов заголовков, предоставляющих платформенно-независимые точные типы ширины. Стандартная библиотека C предоставляет stdint.h ; это было введено в C99 и C++11.

Синтаксис

Целочисленные литералы могут быть записаны как обычные арабские цифры , состоящие из последовательности цифр и с отрицанием, обозначенным знаком минус перед значением. Однако большинство языков программирования не допускают использования запятых или пробелов для группировки цифр . Примерами целочисленных литералов являются:

Во многих языках программирования существует несколько альтернативных методов записи целочисленных литералов:

Смотрите также

Примечания

  1. ^ Не все диалекты SQL имеют беззнаковые типы данных. [4] [5]
  2. ^ abcdefghijklmn Размеры типов char , short , int , long и long long в C/C++ зависят от реализации языка.
  3. ^ Java напрямую не поддерживает арифметику над типами char . Результаты должны быть приведены обратно к char из int .
  4. ^ ab Размеры Integer и Cardinal в Delphi не гарантируются и различаются в зависимости от платформы; обычно они определяются как LongInt и LongWord соответственно.
  5. ^ ab Зарезервировано для будущего использования. Пока не реализовано.
  6. ^ Стандарт ISO C позволяет реализациям резервировать значение со знаковым битом 1 и всеми остальными битами 0 (для знаковой величины и представления в дополнительном коде) или со всеми битами 1 (для дополнительного кода) для использования в качестве значения «ловушки», используемого для указания (например) переполнения. [11]

Ссылки

  1. ^ Чивер, Эрик. «Представление чисел». Swarthmore College . Получено 11 сентября 2011 г.
  2. ^ Мадхусудхан Конда (2011-09-02). "Взгляд на новые возможности Java 7 - O'Reilly Radar". Radar.oreilly.com . Получено 2013-10-15 .
  3. ^ Барр, Адам (2018-10-23). ​​Проблема с программным обеспечением: почему умные инженеры пишут плохой код. MIT Press. ISBN 978-0-262-34821-8.
  4. ^ «Sybase Adaptive Server Enterprise 15.5: Точные числовые типы данных».
  5. ^ «Числовые типы данных MySQL 5.6».
  6. ^ "BigInteger (Java Platform SE 6)". Oracle . Получено 2011-09-11 .
  7. ^ abcde Фог, Агнер (2010-02-16). "Соглашения о вызовах для различных компиляторов C++ и операционных систем: Глава 3, Представление данных" (PDF) . Получено 2010-08-30 .
  8. ^ Торстен Лимхейс (2011-09-13). "Журнал ядра: x32 ABI обходит недостатки 64-битной архитектуры". www.h-online.com. Архивировано из оригинала 28 октября 2011 г. Получено 2011-11-01 .
  9. ^ Жигер, Эрик (18 декабря 1987 г.). «Стандарт ANSI: Резюме для программистов на языке C» . Получено 4 сентября 2010 г.
  10. ^ ab Meyers, Randy (2000-12-01). "Новый C: Целые числа в C99, Часть 1". drdobbs.com . Получено 2010-09-04 .
  11. ^ abcd "ISO/IEC 9899:201x" (PDF) . open-std.org. раздел 6.2.6.2, параграф 2 . Получено 20.06.2016 .
  12. ^ abc "ISO/IEC 9899:201x" (PDF) . open-std.org. раздел 5.2.4.2.1 . Получено 20.06.2016 .
  13. ^ "Основные типы в C++". cppreference.com . Получено 5 декабря 2010 г. .
  14. ^ "Глава 8.6.2 на стр. 12" (PDF) . ecma-international.org.
  15. ^ Файл справки VB 6.0
  16. ^ "Целочисленные, длинные и байтовые типы данных (VBA)". microsoft.com . Получено 2006-12-19 .
  17. ^ Жигер, Эрик (18 декабря 1987 г.). «Стандарт ANSI: Резюме для программистов на языке C» . Получено 04.09.2010 .
  18. ^ "Американский национальный стандарт языка программирования C определяет синтаксис и семантику программ, написанных на языке программирования C". Архивировано из оригинала 2010-08-22 . Получено 2010-09-04 .
  19. ^ Черновик 6-го издания ECMAScript: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-literals-numeric-literals Архивировано 16 декабря 2013 г. на Wayback Machine