В компьютерной науке, целое является ИГД из интегрального типа данных , с типом данных , который представляет некоторый диапазон математических чисел . Интегральные типы данных могут иметь разные размеры и могут содержать или не содержать отрицательные значения. Целые числа обычно представлены в компьютере как группа двоичных цифр (битов). Размер группировки различается, поэтому набор доступных целочисленных размеров варьируется для разных типов компьютеров. Компьютерное оборудование почти всегда позволяет представить регистр процессора или адрес памяти в виде целого числа.
Ценность и представление
Значение какого - либо пункта с интегральным типом является математическим целым числом , что оно соответствует. Целочисленные типы могут быть беззнаковыми (способными представлять только неотрицательные целые числа) или знаковыми (способными также представлять отрицательные целые числа). [1]
Целочисленное значение обычно указывается в исходном коде программы как последовательность цифр, необязательно с префиксом + или -. Некоторые языки программирования допускают другие обозначения, такие как шестнадцатеричное (основание 16) или восьмеричное (основание 8). Некоторые языки программирования также допускают разделители групп цифр . [2]
Внутреннее представление этого элемента данных является то , как значение сохраняется в памяти компьютера. В отличие от математических целых чисел, типичные данные в компьютере имеют минимальное и максимальное возможное значение.
Наиболее распространенное представление положительного целого числа - строка битов в двоичной системе счисления . Порядок байтов памяти, в которых хранятся биты, варьируется; видеть порядок байтов . Ширина или точности интегрального типа является числом бит в его представлении. Целочисленный тип с n битами может кодировать 2 n чисел; например, беззнаковый тип обычно представляет неотрицательные значения от 0 до 2 n -1. Другие кодировки целочисленных значений для битовых комбинаций иногда используются, например , двоично-кодированной десятичной или код Грея , или в виде печатных кодов символов , таких как ASCII .
Существует четыре хорошо известных способа представления чисел со знаком в двоичной вычислительной системе. Наиболее распространенным является дополнение до двух , которое позволяет целочисленному типу со знаком с n битами представлять числа от −2 ( n −1) до 2 ( n −1) −1. Арифметика с дополнением до двух удобна тем, что существует идеальное взаимно однозначное соответствие между представлениями и значениями (в частности, нет отдельных +0 и -0), и потому , что сложение , вычитание и умножение не должны различать подписанные и беззнаковые типы. . Другие возможности включают двоичное смещение , величину знака и дополнение до единиц .
Некоторые компьютерные языки определяют целочисленные размеры машинно-независимым способом; другие имеют разные определения в зависимости от размера слова процессора. Не все языковые реализации определяют переменные всех целочисленных размеров, а определенные размеры могут даже не различаться в конкретной реализации. Целое число на одном языке программирования может иметь другой размер на другом языке или на другом процессоре.
Общие интегральные типы данных
Биты | Имя | Диапазон (при условии , двоичное дополнение для подписано ) | Десятичные цифры | Использует | Реализации | ||||||
---|---|---|---|---|---|---|---|---|---|---|---|
C / C ++ | C # | Паскаль и Дельфи | Ява | SQL [a] | FORTRAN | D | |||||
4 | клев , semioctet | Подпись: от −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 , знаковый символ [b] | сбайт | Shortint | байт | tinyint | целое число (1) | байт |
Без знака: от 0 до 255, что равно 2 8 - 1. | 2.41 | uint8_t , беззнаковый символ [b] | байт | Байт | н / д | беззнаковый tinyint | н / д | убайт | |||
16 | полуслова, слово , короткое, i16, u16 | Подпись: от −32 768 до 32 767, от - (2 15 ) до 2 15 - 1 | 4,52 | Символы UCS-2 , кодовые единицы в кодировке символов UTF-16 | int16_t , короткий [b] , int [b] | короткая | Смоллинт | короткая | Smallint | целое число (2) | короткая |
Без знака: от 0 до 65 535, что равно 2 16 - 1 | 4.82 | uint16_t, беззнаковый [b] , беззнаковое целое [b] | ushort | Слово | символ [c] | беззнаковый smallint | н / д | ushort | |||
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 , int [b] , длинный [b] | int | LongInt ; Целое число [d] | int | int | целое число (4) | int |
Без знака: от 0 до 4 294 967 295, что равно 2 32 - 1. | 9,63 | uint32_t, беззнаковый [b] , беззнаковое целое [b] , беззнаковый длинный [b] | uint | LongWord ; DWord ; Кардинал [d] | н / д | беззнаковое целое | н / д | uint | |||
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 , длинный [b] , долго долго [b] | длинный | Int64 | длинный | Bigint | целое число (8) | длинный |
Без знака: от 0 до 18 446 744 073 709 551 615, что равно 2 64 - 1. | 19,27 | uint64_t , беззнаковый длинный длинный [b] | Улонг | UInt64 ; QWord | н / д | беззнаковый bigint | н / д | Улонг | |||
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) | цент [е] |
Без подписи: от 0 до 340 282 366 920 938 463 463 374 607 431 768 211 455, что равно 2 128 - 1. | 38,53 | н / д | ucent [e] | ||||||||
п | n -битное целое число (общий случай) | Подписано: от - (2 n −1 ) до (2 n −1 - 1) | ( n - 1) журнал 10 2 | Ада : диапазон -2 ** (n-1) .. 2 ** (n-1) -1 | |||||||
Без знака: от 0 до (2 n - 1) | п журнал 10 2 | Ада: диапазон 0..2 ** n-1 , mod 2 ** n ; Классы BigDecimal или Decimal стандартных библиотек или сторонних произвольных арифметических библиотек на многих языках, таких как Python, C ++ и т. д. |
Разные ЦП поддерживают разные интегральные типы данных. Обычно оборудование поддерживает как подписанные, так и беззнаковые типы, но только небольшой фиксированный набор значений ширины.
В приведенной выше таблице перечислены значения ширины целого типа, которые аппаратно поддерживаются общими процессорами. Языки программирования высокого уровня предоставляют больше возможностей. Обычно используется целочисленный тип с двойной шириной, который имеет вдвое больше битов, чем самый крупный тип, поддерживаемый аппаратным обеспечением. Во многих языках также есть типы битовых полей (указанное количество битов, обычно ограничиваемое максимальной шириной, поддерживаемой аппаратным обеспечением) и типы диапазонов (которые могут представлять только целые числа в указанном диапазоне).
Некоторые языки, такие как Lisp , Smalltalk , REXX , Haskell , Python и Raku, поддерживают целые числа произвольной точности (также известные как целые числа бесконечной точности или большие числа ). Другие языки, которые не поддерживают эту концепцию в качестве конструкции верхнего уровня, могут иметь библиотеки для представления очень больших чисел с использованием массивов меньших переменных, таких как Java BigInteger класс или Perl " bigint ". [5] Они используют столько памяти компьютера, сколько необходимо для хранения чисел; однако компьютер имеет ограниченный объем памяти, поэтому они тоже могут представлять только конечное подмножество математических целых чисел. схемы поддерживают очень большие числа, например, один килобайт памяти может использоваться для хранения чисел длиной до 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 бит. Поскольку это архитектурно, размер слова обычно устанавливается первым процессором в семействе, а не характеристиками более позднего совместимого процессора. Значения терминов , полученные из слова , такие как LongWord , двойное слово , четверное слово , и полуслово , также изменяются в зависимости от процессора и операционной системой. [6]
Практически все новые настольные процессоры способны использовать 64-битные слова, хотя встроенные процессоры с 8- и 16-битным размером слова все еще распространены. 36-битная длина слова была распространена в первые дни компьютеров.
Одной из важных причин непереносимости программного обеспечения является неправильное предположение, что все компьютеры имеют тот же размер слова, что и компьютер, используемый программистом. Например, если программист, использующий язык C, неправильно объявляет как int переменная, которая будет использоваться для хранения значений больше 2 15 -1, программа не выполнится на компьютерах с 16-битными целыми числами. Эта переменная должна была быть объявлена как long , который имеет как минимум 32 бита на любом компьютере. Программисты также могут ошибочно предполагать, что указатель может быть преобразован в целое число без потери информации, что может работать на (некоторых) 32-разрядных компьютерах, но не работать на 64-разрядных компьютерах с 64-разрядными указателями и 32-разрядными целыми числами. Эта проблема решена C99 в stdint.h в виде intptr_t
.
Короткое целое число
Короткое целое может представлять собой целое число , которое может принимать меньше памяти, в то время как имеющую меньший диапазон, по сравнению со стандартным целым числом на ту же машину.
В C это обозначается как коротко . Он должен быть не менее 16 бит и часто меньше стандартного целого числа, но это не обязательно. [7] [8] Соответствующая программа может предполагать, что она может безопасно хранить значения между - (2 15 -1) [9] и 2 15 -1, [10], но не может предполагать, что диапазон не больше. В Java , Короче говоря это всегда 16-битное целое число. В Windows API тип данных SHORT определяется как 16-битовое целое число со знаком на всех машинах. [6]
Язык программирования | Имя типа данных | Подпись | Размер в байтах | Минимальное значение | Максимальное значение |
---|---|---|---|---|---|
C и C ++ | короткая | подписанный | 2 | -32 767 [f] | +32 767 |
беззнаковый короткий | беззнаковый | 2 | 0 | 65 535 | |
C # | короткая | подписанный | 2 | −32 768 | +32 767 |
ushort | беззнаковый | 2 | 0 | 65 535 | |
Ява | короткая | подписанный | 2 | −32 768 | +32 767 |
Длинное целое
Длинное целое может представлять собой целое число , чей диапазон больше или равен стандартного целое число на ту же машину.
В C это обозначается как долго . Он должен быть не менее 32 бита и может быть или не быть больше стандартного целого числа. Соответствующая программа может предполагать, что она может безопасно хранить значения между - (2 31 -1) [9] и 2 31 -1, [10], но не может предполагать, что диапазон не больше.
Язык программирования | Тип утверждения | Платформы | Имя типа данных | Хранение в байтах | Подписанный диапазон | Беззнаковый диапазон |
---|---|---|---|---|---|---|
C ISO / ANSI C99 | Международный стандарт | Unix , 16/32-битные системы [6] Windows , 16/32/64-битные системы [6] | длинный [г] | 4 (минимальное требование 4) | От −2 147 483 647 до +2 147 483 647 | От 0 до 4 294 967 295 (минимальное требование) |
C ISO / ANSI C99 | Международный стандарт | Unix , 64-битные системы [6] [8] | длинный [г] | 8 (минимальное требование 4) | От −9,223,372,036,854,775,807 до +9,223,372,036,854,775,807 | От 0 до 18 446 744 073 709 551 615 |
C ++ ISO / ANSI | Международный стандарт | Unix , Windows , 16/32-битная система | длинный [г] | 4 [12] (минимальное требование 4) | От −2 147 483 648 до +2 147 483 647 | От 0 до 4 294 967 295 (минимальное требование) |
C ++ / CLI | Международный стандарт ECMA-372 | Unix , Windows , 16/32-битные системы | длинный [г] | 4 [13] (минимальное требование 4) | От −2 147 483 648 до +2 147 483 647 | От 0 до 4 294 967 295 (минимальное требование) |
VB | Стандарт компании | Окна | Длинный | 4 [14] | От −2 147 483 648 до +2 147 483 647 | N / A |
VBA | Стандарт компании | Windows , Mac OS X | Длинный | 4 [15] | От −2 147 483 648 до +2 147 483 647 | N / A |
SQL Server | Стандарт компании | Окна | BigInt | 8 | От −9,223,372,036,854,775,808 до +9,223,372,036,854,775,807 | От 0 до 18 446 744 073 709 551 615 |
C # / VB.NET | Международный стандарт ECMA | Microsoft .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 | N / A |
Паскаль | ? | 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 ++ 11 версии C ++ , long long
тип поддерживается , который имеет двойную минимальную мощность стандарта long
. Этот тип не поддерживается компиляторами, которым требуется, чтобы код C соответствовал предыдущему стандарту C ++, C ++ 03, поскольку Тип long long не существовал в C ++ 03. Для компилятора, совместимого с ANSI / ISO, минимальные требования для указанных диапазонов, то есть от - (2 63 -1) [9] до 2 63 -1 для подписанных и от 0 до 2 64 -1 для беззнаковых, [10] должны быть выполненным; тем не менее, расширение этого диапазона разрешено. [16] [17] Это может быть проблемой при обмене кодом и данными между платформами или при прямом доступе к оборудованию. Таким образом, существует несколько наборов заголовков, обеспечивающих независимые от платформы типы точной ширины. Стандартная библиотека C предоставляет stdint.h ; это было введено в C99 и C ++ 11.
Смотрите также
- Арифметика произвольной точности
- Десятичное число с двоичным кодом (BCD)
- Типы данных C
- Целочисленное переполнение
- Знаковые представления чисел
Заметки
- ^ Не все диалекты SQL имеют беззнаковые типы данных. [3] [4]
- ^ a b c d e f g h i j k l m n Размеры голец , коротко , int , долго и long long в C / C ++ зависят от реализации языка.
- ^ Java не поддерживает арифметику напрямую на типы символов . Результаты должны быть возвращены в символ из внутр .
- ^ a b Размеры Delphi Целое и Cardinal не гарантируются, в зависимости от платформы; обычно определяется как LongInt и LongWord соответственно.
- ^ a b Зарезервировано для использования в будущем. Еще не реализовано.
- ^ Стандарт ISO C позволяет реализациям зарезервировать значение с помощью знакового бита 1 и всех остальных битов 0 (для знакового значения и представления дополнения до двух) или со всеми битами 1 (для дополнения до единиц) для использования в качестве значения "ловушки", используется для обозначения (например) переполнения. [9]
- ^ a b c d Условия долго и int эквивалентны [11]
Рекомендации
- ^ Чивер, Эрик. «Представление чисел» . Свортмор-колледж . Проверено 11 сентября 2011 .
- ^ Мадхусудхан Конда (02.09.2011). «Взгляните на новые возможности Java 7 - O'Reilly Radar» . Radar.oreilly.com . Проверено 15 октября 2013 .
- ^ «Sybase Adaptive Server Enterprise 15.5: точные числовые типы данных» .
- ^ "MySQL 5.6 Числовые типы данных" .
- ^ «BigInteger (Java Platform SE 6)» . Oracle . Проверено 11 сентября 2011 .
- ^ а б в г д Туман, Агнер (16.02.2010). «Соглашения о вызовах для различных компиляторов C ++ и операционных систем: Глава 3, Представление данных» (PDF) . Проверено 30 августа 2010 .
- ^ Жигер, Эрик (1987-12-18). «Стандарт ANSI: Резюме для программиста на C» . Проверено 4 сентября 2010 .
- ^ а б Мейерс, Рэнди (2000-12-01). «Новый C: целые числа в C99, часть 1» . drdobbs.com . Проверено 4 сентября 2010 .
- ^ а б в г «ISO / IEC 9899: 201x» (PDF) . open-std.org. раздел 6.2.6.2, параграф 2 . Проверено 20 июня 2016 .
- ^ а б в «ISO / IEC 9899: 201x» (PDF) . open-std.org. раздел 5.2.4.2.1 . Проверено 20 июня 2016 .
- ^ «ISO / IEC 9899: 201x» (PDF) . open-std.org . Проверено 27 марта 2013 .
- ^ «Фундаментальные типы в C ++» . cppreference.com . Проверено 5 декабря 2010 года .
- ^ «Глава 8.6.2 на странице 12» (PDF) . ecma-international.org.
- ^ Файл справки VB 6.0
- ^ «Целочисленные, длинные и байтовые типы данных (VBA)» . microsoft.com . Проверено 19 декабря 2006 .
- ^ Жигер, Эрик (18 декабря 1987 г.). «Стандарт ANSI: Резюме для программиста на C» . Проверено 4 сентября 2010 .
- ^ «Американский национальный стандартный язык программирования C определяет синтаксис и семантику программ, написанных на языке программирования C» . Архивировано из оригинала на 2010-08-22 . Проверено 4 сентября 2010 .