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

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

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

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

Значением элемента с целочисленным типом является соответствующее ему математическое целое число. Целочисленные типы могут быть беззнаковыми ( способными представлять только неотрицательные целые числа) или знаковыми (способными представлять также отрицательные целые числа). [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-битное слово) или могут иметь переменную длину (до некоторого максимального размера цифры), обычно занимая две цифры на байт (октет).

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

БитыИмяДиапазон (предполагая дополнение до двух для знакового )Десятичные цифрыИспользуетРеализации
С / С++С#Паскаль и ДельфиЯваSQL [а]ФОРТРАНДРжавчина
4полубайт , полуоктетПодписано: От −8 до 7, от −(2 3 ) до 2 3  − 10.9Двоично-десятичное число , представление одной десятичной цифры
Без знака: от 0 до 15, что равно 2 4  − 11.2
8байт , октет , i8, u8Подписано: От −128 до 127, от −(2 7 ) до 2 7  − 12.11Символы ASCII , кодовые единицы в кодировке UTF-8 int8_t , знаковый символ [b]сбайтКраткобайткрошечныйинтЦЕЛОЕ ЧИСЛО [c]байтя8
Без знака: от 0 до 255, что равно 2 8  − 12.41uint8_t , беззнаковый символ [b]байтБайтбеззнаковый tinyintюбайту8
16полуслово, слово , короткое, i16, u16Подписано: От −32,768 до 32,767, от −(2 15 ) до 2 15  − 14.52Символы UCS-2 , кодовые единицы в кодировке UTF-16 int16_t , короткий , [б] int [б] короткийМаленькийкороткиймаленькийЦЕЛОЕ ЧИСЛО [c]короткийя16
Без знака: от 0 до 65 535, что равно 2 16  − 14.82uint16_t, беззнаковый , [b] беззнаковое целое [b]ушортСловосимвол [d]беззнаковый smallintушорту16
32слово, длинное , двойное слово, длинное слово, int, i32, u32Подписано: От −2,147,483,648 до 2,147,483,647 , от −(2 31 ) до 2 31  − 19.33Символы UTF-32 , true color с альфа-каналом, FourCC , указатели в 32-битных вычисленияхint32_t , int , [b] длинный [b] интLongInt ; Целое число [e]интинтЦЕЛОЕ ЧИСЛО [c]инти32
Без знака: от 0 до 4 294 967 295, что равно 2 32  − 19.63uint32_t, беззнаковый , [b] беззнаковый int , [b] беззнаковый long [b] uintДлинное слово ; Двойное слово ; Кардинальное [e]беззнаковое целоеuintу32
64слово, двойное слово, длинное слово, длинное, длинное длинное, четверное, четверное слово, qword, int64, i64, u64Подписано: От −(2 63 ) до 2 63  − 118.96Время (например, миллисекунды с начала эпохи Unix ), указатели в 64-битных вычисленияхint64_t , длинный , [б] длинный длинный [б] длинныйInt64длинныйbigintЦЕЛОЕ ЧИСЛО [c]длинныйi64
Без знака: от 0 до 2 64  − 119.27uint64_t , беззнаковый длинный длинный [b]улунUInt64 ; QWordбеззнаковый bigintулуну64
128октаворд, двойное квадроворд, i128, u128Подписано: От −(2 127 ) до 2 127  − 138.23Сложные научные расчеты,

IPv6- адреса, GUID

Доступно только как нестандартные или специфичные для компилятора расширенияцент [ж]я128
Без знака: от 0 до 2 128  − 138.53ucent [ж]у128
нn- битное целое число
(общий случай)
Подписано: −(2 n −1 ) до (2 n −1  − 1)( n  − 1) лог 10  2C23: _BitInt(n) , подписанный _BitInt(n)Ада :range -2**(n-1)..2**(n-1)-1
Без знака: от 0 до (2 n − 1)n log 10  2C23: беззнаковый _BitInt(n)Ada: , ; классы BigDecimal или Decimal стандартных библиотек или сторонних библиотек произвольной арифметики во многих языках, таких как Python, C++ и т. д.range 0..2**n-1mod 2**n

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

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

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

Булев тип — это тип, который может представлять только два значения: 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 ]

Обычные размеры коротких целых чисел
Язык программированияИмя типа данныхПодписанностьРазмер в байтахМинимальное значениеМаксимальное значение
С и С++короткийподписано2−32,767 [г]+32,767
беззнаковый короткийнеподписанный2065,535
С#короткийподписано2−32,768+32,767
ушортнеподписанный2065,535
Явакороткийподписано2−32,768+32,767
SQLмаленькийподписано2−32,768+32,767

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

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

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

Распространенные размеры длинных целых чисел
Язык программированияТип утвержденияПлатформыИмя типа данныхХранение в байтахПодписанный диапазонБеззнаковый диапазон
C ISO/ANSI C99Международный стандартUnix , 16/32-битные системы [7]
Windows , 16/32/64-битные системы [7]
длинный4
(минимальное требование 4)
−2,147,483,647 до +2,147,483,647От 0 до 4 294 967 295
(минимальное требование)
C ISO/ANSI C99Международный стандартUnix ,
64-битные системы [7] [10]
длинный8
(минимальное требование 4)
−9,223,372,036,854,775,807 до +9,223,372,036,854,775,8070 до 18,446,744,073,709,551,615
C++ ISO/ANSIМеждународный стандартUnix , Windows ,
16/32-битная система
длинный4 [13]
(минимальное требование 4)
−2,147,483,648 до +2,147,483,647
От 0 до 4 294 967 295
(минимальное требование)
C++/CLIМеждународный стандарт
ECMA-372
Unix , Windows ,
16/32-битные системы
длинный4 [14]
(минимальное требование 4)
−2,147,483,648 до +2,147,483,647
От 0 до 4 294 967 295
(минимальное требование)
ВБСтандарт компанииОкнаДлинный4 [15]−2,147,483,648 до +2,147,483,647
ВБАСтандарт компанииWindows , Mac OS XДлинный4 [16]−2,147,483,648 до +2,147,483,647
SQL-серверСтандарт компанииОкнаBigInt8−9,223,372,036,854,775,808 до +9,223,372,036,854,775,8070 до 18,446,744,073,709,551,615
C# / VB.NETМеждународный стандарт ECMAMicrosoft .NETдлинный или Int648−9,223,372,036,854,775,808 до +9,223,372,036,854,775,8070 до 18,446,744,073,709,551,615
ЯваМеждународный/корпоративный стандартJava-платформадлинный8−9,223,372,036,854,775,808 до +9,223,372,036,854,775,807
Паскаль?Windows , UNIXint648−9,223,372,036,854,775,808 до +9,223,372,036,854,775,807От 0 до 18 446 744 073 709 551 615 (тип Qword)

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

В версии 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.

Синтаксис

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

  • 42
  • 10000
  • -233000

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

  • Многие языки программирования, особенно те, которые возникли под влиянием C , добавляют к целочисленному литералу префикс 0Xили 0xдля представления шестнадцатеричного значения, например 0xDEADBEEF. Другие языки могут использовать другую нотацию, например, некоторые языки ассемблера добавляют Hили hв конец шестнадцатеричного значения.
  • Perl , Ruby , Java , Julia , D , Go , C# , Rust и Python (начиная с версии 3.6) допускают встроенные подчеркивания для ясности, например 10_000_000, а фиксированная форма Fortran игнорирует встроенные пробелы в целочисленных литералах. C (начиная с C23 ) и C++ используют для этой цели одинарные кавычки.
  • В C и C++ начальный ноль указывает на восьмеричное значение, например 0755. Это изначально предназначалось для использования в режимах Unix ; однако это подвергалось критике, поскольку обычные целые числа также могут начинаться с нуля. [19] Таким образом, Python , Ruby , Haskell и OCaml добавляют к восьмеричным значениям префикс 0Oили 0o, следуя схеме, используемой для шестнадцатеричных значений.
  • Несколько языков, включая Java , C# , Scala , Python , Ruby , OCaml , C (начиная с C23) и C++, могут представлять двоичные значения, добавляя к числу префикс 0Bили 0b.

Экстремальные значения

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

Названия для них включают:

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

Примечания

  1. ^ Не все диалекты SQL имеют беззнаковые типы данных. [4] [5]
  2. ^ abcdefghijklmn Размеры типов char , short , int , long и long long в C/C++ зависят от реализации языка.
  3. ^ abcd Fortan использует 'kinds' для управления размером целых чисел. Параметризованные константы, определяющие доступные виды, доступны во встроенном модуле iso_fortran_env. Константы, определяющие виды, совместимые с C, доступны во встроенном модуле iso_c_binding.
  4. ^ Java напрямую не поддерживает арифметику над типами char . Результаты должны быть приведены обратно к char из int .
  5. ^ ab Размеры Integer и Cardinal в Delphi не гарантируются и различаются в зависимости от платформы; обычно они определяются как LongInt и LongWord соответственно.
  6. ^ ab Зарезервировано для будущего использования. Пока не реализовано.
  7. ^ Стандарт 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
  20. ^ "SmallBASIC | MAXINT" . Получено 20.01.2025 .
  21. ^ "Integer (Java Platform SE 8)" . Получено 2025-01-20 .
  22. ^ "Пределы базовых типов" . Получено 2025-01-20 .
  23. ^ Грогоно, Питер (1995). Программирование с Тьюрингом и объектно-ориентированный Тьюринг . Нью-Йорк: Springer. стр. 363. doi :10.1007/978-1-4612-4238-3. LCCN  95010802.
Взято с "https://en.wikipedia.org/w/index.php?title=Целое число_(компьютерная_наука)&oldid=1271043691"