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

Из Википедии, бесплатной энциклопедии

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

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

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

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

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

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

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

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

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

данных Общие целочисленные типы

Биты Имя Диапазон (при условии дополнения до двух для подписанного ) Десятичные цифры Использование Реализации
С / С++ С# Паскаль и Дельфи Джава SQL [а] ФОРТРАН Д Ржавчина
4 полубайт , полуоктет Подпись: От −8 до 7, от −(2 3 ) до 2 3  − 1 0.9 Двоично-десятичное представление , представление одной десятичной цифры
Без знака: от 0 до 15, что равно 2. 4  − 1 1.2
8 байт , октет , i8, u8 Подпись: От −128 до 127, от −(2 7 ) до 2 7  − 1 2.11 ASCII Символы , кодовые единицы в UTF-8. кодировке символов int8_t , подписанный символ [б] сбайт Краткое описание байт крошечныйинт целое число(1) байт i8
Без знака: от 0 до 255, что равно 2. 8  − 1 2.41 uint8_t , беззнаковый символ [б] байт Байт беззнаковый крошечный int потерянный ты8
16 полуслово, слово , короткое, i16, u16 Подписано: От −32 768 до 32 767, от −(2 15 ) до 2 15  − 1 4.52 Символы UCS-2 , кодовые единицы в UTF-16. кодировке символов int16_t , короткий [б] , интервал [б] короткий Смоллинт короткий smallint целое число(2) короткий я16
Без знака: от 0 до 65 535, что равно 2. 16  − 1 4.82 uint16_t, без знака [б] , беззнаковое целое число [б] сокращать Слово голец [с] беззнаковый smallint сокращать u16
32 слово, длинное , двойное слово, длинное слово, int, i32, u32 Подписано: от -2 147 483 648 до 2 147 483 647 , от -(2 31 ) до 2 31  − 1 9.33 Символы UTF-32 , настоящий цвет с альфа-каналом, FourCC , указатели в 32-битных вычислениях. int32_t , интервал [б] , длинный [б] интервал ЛонгИнт ; Целое число [д] интервал интервал целое число(4) интервал я32
Без знака: от 0 до 4 294 967 295, что равно 2. 32  − 1 9.63 uint32_t, без знака [б] , беззнаковое целое число [б] , беззнаковый длинный [б] uint Длинное слово ; ДСлово ; Кардинал [д] беззнаковое целое число uint и32
64 слово, двойное слово, длинное слово, длинный, длинный длинный, четверка, четверное слово, qword, int64, i64, u64 Подпись: от -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807, от -(2 63 ) до 2 63  − 1 18.96 Время (миллисекунды с эпохи Unix ), указатели в 64-битных вычислениях int64_t , длинный [б] , долго долго [б] длинный Int64 длинный bigint целое число(8) длинный я64
Без знака: от 0 до 18 446 744 073 709 551 615, что равно 2. 64  − 1 19.27 uint64_t , беззнаковый длинный длинный [б] голова UInt64 ; QWord беззнаковый bigint голова и64
128 октаслово, двойное четверное слово, i128, u128 Подписано: от -170 141 183 460 469 231 731 687 303 715 884 105 728 до 170 141 183 460 469 231 731 687 303 715 884 105 727, от -(2 127 ) до 2 127  − 1 38.23 Сложные научные расчеты,

IPv6- адреса, GUID

C: доступен только как нестандартное расширение, специфичное для компилятора. целое число(16) цент [Это] я128
Без знака: от 0 до 340 282 366 920 938 463 463 374 607 431 768 211 455, что равно 2. 128  − 1 38.53 интенсивный [Это] u128
н n -битное целое число
(общий случай)
Подпись: −(2 п -1 ) до (2 п -1  − 1) ( n − 1) log 10 2 С23: _BitInt(n) , подписано _BitInt(n) Есть : диапазон -2**(n-1)..2**(n-1)-1
Без знака: от 0 до (2 н − 1) п журнал 10 2 С23: беззнаковый _BitInt(n) Есть: диапазон 0..2**n-1 , мод 2**n ; классы BigDecimal или Decimal стандартных библиотек или сторонних библиотек произвольной арифметики на многих языках, таких как Python, C++ и т. д.

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

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

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

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

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

Байты и октеты [ править ]

Термин «байт» изначально означал «наименьшую адресуемую единицу памяти». Раньше использовались 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-битные двоичные файлы, а программы, скомпилированные для Linux x32 ABI, работают в 64-битном режиме, но используют 32-битные адреса памяти. [8]

Стандартное целое число [ править ]

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

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

Короткое целое число [ править ]

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

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

Распространенные короткие целые размеры
Язык программирования Имя типа данных Подписанность Размер в байтах Минимальное значение Максимальное значение
С и С++ короткий подписано 2 −32,767 [ф] +32,767
беззнаковый короткий без подписи 2 0 65,535
С# короткий подписано 2 −32,768 +32,767
сокращать без подписи 2 0 65,535
Джава короткий подписано 2 −32,768 +32,767
SQL smallint подписано 2 −32,768 +32,767

Длинное целое число [ править ]

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

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

Распространенные размеры длинных целых чисел
Язык программирования Тип утверждения Платформы Имя типа данных Хранение в байтах Знаковый диапазон Беззнаковый диапазон
С ИСО/АНСИ С99 Международный стандарт Unix , 16/32-битные системы [7]
Windows , 16/32/64-битные системы [7]
длинный 4
(минимальное требование 4)
от −2 147 483 647 до +2 147 483 647 от 0 до 4 294 967 295
(минимальное требование)
С ИСО/АНСИ С99 Международный стандарт Юникс ,
64-битные системы [7] [10]
длинный 8
(минимальное требование 4)
от −9 223 372 036 854 775 807 до +9 223 372 036 854 775 807 от 0 до 18 446 744 073 709 551 615
С++ ISO/ANSI Международный стандарт Юникс , Винда ,
16/32-битная система
длинный 4 [13]
(минимальное требование 4)
от −2 147 483 648 до +2 147 483 647
от 0 до 4 294 967 295
(минимальное требование)
С++/CLI Международный стандарт
ЭКМА-372
Юникс , Винда ,
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-сервер Стандарт компании Окна БигИнт 8 от −9 223 372 036 854 775 808 до +9 223 372 036 854 775 807 от 0 до 18 446 744 073 709 551 615
С# / ВБ.NET Международный стандарт ECMA Майкрософт .NET длинный или Int64 8 от −9 223 372 036 854 775 808 до +9 223 372 036 854 775 807 от 0 до 18 446 744 073 709 551 615
Джава Международный/корпоративный стандарт Java-платформа длинный 8 от −9 223 372 036 854 775 808 до +9 223 372 036 854 775 807
Паскаль ? Windows , UNIX int64 8 от −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 , 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. ^ Перейти обратно: а б с д Это ж г час я дж к л м н Размеры чар , короткий , интервал , длинный и long long в C/C++ зависят от реализации языка.
  3. ^ Java напрямую не поддерживает арифметику на типы символов . Результаты должны быть возвращены в голец из инт .
  4. ^ Перейти обратно: а б Размеры Дельфи Целое число и Cardinal не гарантируется и варьируется от платформы к платформе; обычно определяется как ЛонгИнт и ЛонгВорд соответственно.
  5. ^ Перейти обратно: а б Зарезервировано для будущего использования. Еще не реализовано.
  6. ^ Стандарт ISO C позволяет реализациям резервировать значение с битом знака 1 и всеми остальными битами 0 (для представления знака-величины и дополнения до двух) или со всеми битами 1 (для дополнения до единиц) для использования в качестве значения «ловушки», используется для обозначения (например) переполнения. [11]

Ссылки [ править ]

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