В WINAPI определено множество типов данных, так же, как и в C/С++ (int
, char
, float
и т.д.). Учить их определения не обязательно. Достаточно помнить, что они существуют, а когда они появятся или потребуются где-нибудь в программе, посмотреть их определения. В дальнейшем мы будем использовать их все. Условно их можно разделить на несколько видов: основные, дескрипторные, строковые и вспомогательные.
Основные типы
С основными типами данных трудностей возникнуть не должно. Если всё же возникнут, то нужно сюда.
BOOL
– этот тип данных аналогичен bool
. Он также имеет два значения – 0 или 1. Только при использовании WINAPI принято использовать вместо 0 спецификатор NULL
. О нём ниже.
BYTE
– байт, ну или восьмибитное беззнаковое целое число. Аналог – unsigned char
.
DWORD
— 32-битное беззнаковое целое. Аналоги: unsigned long int
, UINT
.
INT
– 32-битное целое. Аналог – long int
.
LONG
– 32-битное целое – аналог всё также long int
.
NULL
– нулевой указатель. Вот его объявление:
void *NULL=0;
UINT
– 32-битное беззнаковое целое. Аналоги: unsigned long int
, DWORD
.
Дескрипторные типы данных
Про дескрипторные типы немного рассказывалось на вводном уроке в WINAPI. Дескриптор, как говорилось ранее, — это идентификатор какого-либо объекта. Для разных типов объектов существуют разные дескрипторы. Дескриптор объекта можно описать так:
HANDLE h;
Есть также дескрипторы кисти, курсора мыши, шрифта и т.д. С их помощью мы можем при инициализации или в процессе работы приложения поменять какие-нибудь настройки, чего, например, мы не могли сделать в консольном приложении. Используются они в описательных функциях, управляющих типа: CreateProcess(), ShowWindow() и т.д. или как возвращаемое значение некоторых функций :
// получает дескриптор для устройства ввода или вывода: HANDLE h = GetStdHandle(DWORD nStdHandle);
В этой функции мы получили дескриптор считывания потоков std_in и std_out. И можем, например, его использовать в каком-нибудь условии.
Не будем вдаваться в физику создания дескрипторов. Разве что, при необходимости или для большего понимания процессов.
Примечание: для удобства в WINAPI предусмотрены сокращения для типов данных. Первая буква H – означает, что это дескриптор, от слова handle.
HANDLE
– дескриптор объекта.
HBITMAP
– дескриптор растрового изображения. От фразы handle bitmap.
HBRUSH
– дескриптор кисти. От фразы handle brush.
HCURSOR
– дескриптор курсора. От фразы handle cursor.
HDC
– дескриптор контекста устройства. От фразы handle device context.
HFONT
– дескриптор шрифта. От фразы handle font.
HICONS
– дескриптор криптограммы. От фразы handle icons.
HINSTANCE
– дескриптор экземпляра приложения. От фразы handle instance.
HMENU
– дескриптор меню. От фразы handle menu.
HPEN
– дескриптор пера. От фразы handle pen.
HWND
– дескриптор окна. От фразы handle window.
Строковые типы данных
Для начала начнём, с того, какие кодировки существуют в Windows ОС.
Есть два вида кодировок символов: ANSI и UNICODE. Однобайтные символы относятся к ANSI, двухбайтные — к кодировке UNICODE. Мы можем с лёгкостью подключить UNICODE кодировку в свойствах проекта. И тогда в коде создать переменную типа char можно будет так:
// создаём строку из 10 элементов: wchar_t str[10];
Если же мы хотим использовать кодировку ANSI, то мы традиционно напишем:
// тоже создаём строку из 10 элементов: char str[10];
В WINAPI, в зависимости от того, подключён юникод или нет, используются два вида строк UNICODE-ные или TCHAR-ные. Ниже описаны строковые типы данных.
Всё также для удобства, первые две буквы LP – от фразы long pointer сигнализируют о том, что это указатель.
LPCSTR
– указатель на константную строку, заканчивающуюся нуль-терминатором. От фразы long pointer constant string.
LPCTSTR
– указатель на константную строку, без UNICODE. От фразы long pointer constant TCHAR string. Это надстройка функции LPCSTR.
LPCWSTR
– указатель на константную UNICODE строку. От фразы фразы long pointer constant wide character string. Это надстройка функции LPCSTR.
LPSTR
– указатель на строку, заканчивающуюся нуль-терминатором. От фразы long pointer string.
LPTSTR
– указатель на строку, без UNICODE. От фразы long pointer TCHAR string. Это надстройка функции LPSTR.
LPWSTR
– указатель на UNICODE строку. От фразы long pointer wide character string. Это надстройка функции LPSTR.
TCHAR
– символьный тип — аналог char и wchar_t.
Вспомогательные типы
Вспомогательные типы данных используются в некоторых функциях. В частности, параметры, описанные ниже, используются при работе с функцией обратного вызова оконной процедуры такого вида:
LRESULT CALLBACK ИмяФункции(HWND hWnd, UINT uMSg, WPARAM wParam, LPARAM lParam);
Работа с данной функцией будет в следующих разделах.
LPARAM
– тип для описания lParam (long parameter). Используются вместе с wparam в некоторых функциях.
LRESULT
– значение, возвращаемое оконной процедурой имеет тип long
.
WPARAM
– тип для описания wParam (word parameter). Используются вместе с lParam в некоторых функциях.
На этом типы данных не закончены. В дальнейшем мы обязательно будем обращаться к данной статье.
Public user contributions licensed under
cc-wiki license with attribution required
Provide feedback
Saved searches
Use saved searches to filter your results more quickly
Sign up
Appearance settings
Целое, целочисленный тип данных (англ. Integer), в информатике — один из простейших и самых распространённых типов данных в языках программирования. Служит для представления целых чисел.
Множество чисел этого типа представляет собой конечное подмножество бесконечного множества целых чисел, ограниченное максимальным и минимальным значениями.
В программировании различают беззнаковые целые числа и целые числа со знаком. Знак числа обычно кодируется старшим битом машинного слова. Традиционно, если старший бит равен 1, то число считается отрицательным, только, если оно не определено как беззнаковое.
Количество чисел в машинном изображении множества целых чисел зависит от длины машинного слова, обычно выражаемой в битах. Например, при длине машинного слова 1 байт (8 бит) диапазон представимых целых чисел со знаком от -128 до 127. В беззнаковом формате байтовое представление числа будет от 0 до 255 (28 — 1). Если используется 32-разрядное машинное слово, то целое со знаком будет представлять значения от −2 147 483 648 (-231) до 2 147 483 647 (231−1); всего 1 0000 000016 (4 294 967 29610) возможных значений.
Ограничение длины машинного слова, обусловленное конкретной аппаратной реализацией того или иного компьютера, не препятствие для обработки ими весьма длинных в битах представлений целых чисел, достигаемое усложнением программных алгоритмов. Естественное ограничение — конечность ёмкости памяти и разумное время на исполнение.
Целые числа и вычисления с целыми числами в современных компьютерах имеют очень важное значение (в подавляющем количестве приложений занимают меньше ресурсов процессора, чем, арифметика с плавающей точкой). Вся адресная арифметика и операции с индексами массивов основаны на целочисленных операциях.
Содержание
- 1 Представление
- 1.1 Беззнаковые целые
- 1.2 Целые со знаком
- 1.3 Предельные значения для разных битностей
- 2 Операции над целыми
- 2.1 Арифметические операции
- 2.2 Побитовые операции
- 2.3 Работа со строками
- 3 Перечислимый тип
- 4 См. также
- 5 Примечания
- 6 Литература
Представление[править | править вики-текст]
В памяти типовой компьютерной системы целое число представлено в виде цепочки битов фиксированного (кратного размера. Эта последовательность нулей и единиц — не что иное, как двоичная запись числа, поскольку обычно для представления чисел в современной компьютерной технике используется позиционный двоичный код. Диапазон целых чисел, как правило, определяется количеством байтов в памяти компьютера, отводимых под одну переменную.
Многие языки программирования предлагают выбор между короткими (англ. 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.
Предельные значения для разных битностей[править | править вики-текст]
Ниже представлена таблица предельных значений десятичных чисел для разных битностей при кодировании дополнительным кодом. В колонке «Максимальное десятичное» сначала идёт максимальное значение целого без знака, а под ним минимальное и максимальное целое со знаком.
Бит | Байт | Дв. слов | Максимальное десятичное | Дес. цифр |
---|---|---|---|---|
4 | ½ | ⅛ | 15 -8 +7 |
2 1 1 |
8 | 1 | ¼ | 255 -128 +127 |
3 3 3 |
16 | 2 | ½ | 65535 -32768 +32767 |
5 5 5 |
24 | 3 | ¾ | 16777215 -8388608 +8388607 |
8 7 7 |
32 | 4 | 1 | 4294967295 -2147483648 +2147483647 |
10 10 10 |
48 | 6 | 1½ | 281474976710655 -140737488355328 +140737488355327 |
15 15 15 |
64 | 8 | 2 | 18446744073709551615 -9223372036854775808 +9223372036854775807 |
20 19 19 |
96 | 12 | 3 | 79228162514264337593543950335 -39614081257132168796771975168 +39614081257132168796771975167 |
29 29 29 |
128 | 16 | 4 | 340282366920938463463374607431768211455 -170141183460469231731687303715884105728 +170141183460469231731687303715884105727 |
39 39 39 |
256 | 32 | 8 | 115792089237316195(…)584007913129639935 -57896044618658097(…)792003956564819968 +57896044618658097(…)792003956564819967 |
78 77 77 |
512 | 64 | 16 | 13407807929942597099(…)946433649006084095 -6703903964971298549(…)973216824503042048 +6703903964971298549(…)973216824503042047 |
155 154 154 |
1024 | 128 | 32 | 179769313486231590(…)356329624224137215 -89884656743115795(…)678164812112068608 +89884656743115795(…)678164812112068607 |
309 308 308 |
2048 | 256 | 64 | 32317006071311007(…)853611059596230655 -16158503035655503(…)926805529798115328 +16158503035655503(…)926805529798115327 |
617 617 617 |
4096 | 512 | 128 | 1044388881413152506(…)708340403154190335 -522194440706576253(…)354170201577095168 +522194440706576253(…)354170201577095167 |
1234 1233 1233 |
8192 | 1024 | 256 | 1090748135619415929(…)505665475715792895 -545374067809707964(…)252832737857896448 +545374067809707964(…)252832737857896447 |
2467 2466 2466 |
16384 | 2048 | 512 | 1189731495357231765(…)027290669964066815 -594865747678615882(…)513645334982033408 +594865747678615882(…)513645334982033407 |
4933 4932 4932 |
32768 | 4096 | 1024 | 1415461031044954789(…)668104633712377855 -707730515522477394(…)334052316856188928 +707730515522477394(…)334052316856188927 |
9865 9864 9864 |
65536 | 8192 | 2048 | 2003529930406846464(…)587895905719156735 -1001764965203423232(…)793947952859578368 +1001764965203423232(…)793947952859578367 |
19729 19729 19729 |
131072 | 16384 | 4096 | 4014132182036063039(…)812318570934173695 -2007066091018031519(…)906159285467086848 +2007066091018031519(…)906159285467086847 |
39457 39457 39457 |
262144 | 32768 | 8192 | 16113257174857604736(…)605349934298300415 -8056628587428802368(…)302674967149150208 +8056628587428802368(…)302674967149150207 |
78914 78913 78913 |
524288 | 65536 | 16384 | 259637056783100077(…)364528226185773055 -129818528391550038(…)182264113092886528 +129818528391550038(…)182264113092886527 |
157827 157827 157827 |
1048576 | 131071 | 32767 | 67411401254990734(…)119068940335579135 -33705700627495367(…)559534470167789568 +33705700627495367(…)559534470167789567 |
315653 315653 315653 |
Операции над целыми[править | править вики-текст]
Арифметические операции[править | править вики-текст]
К целочисленным значениям применимы в первую очередь арифметические операции. Ниже приведены самые часто используемые (в скобках указаны их обозначения в различных языках программирования и им аналогичным средствах).
- Сравнение (англ. comparison). Здесь применимы соотношения «равно» («=»; «==»; «eq»), «не равно» («!=»; «<>»; «ne»), «больше» («>»; «gt»), «больше или равно» («>=»; «ge»), «меньше» («<»; «lt») и «меньше или равно» («<=»; «le»).
- Инкремент (англ. increment; «++») и декремент (англ. decrement; «—») — арифметическое увеличение или уменьшение числа на единицу. Выделено в отдельные операции из-за частого использования с переменными-счётчиками в программировании.
- Сложение (англ. addition; «+») и вычитание (англ. subtraction; «-»).
- Умножение (англ. multiplication; «*»).
- Деление (англ. division; «/»; «\») и получение остатка от деления (англ. modulo; «%»). Некоторые процессоры (например, архитектуры x86) позволяют производить обе эти операции за одну инструкцию.
- Инверсия знака (англ. negation) и получение абсолютного значения (англ. absolute).
- Получение знака. Результатом такой операции обычно является 1 для положительных значений, −1 — для отрицательных и 0 — для нуля.
- Возведение в степень («^»).
В некоторых языках программирования для лаконичности есть операторы, которые позволяют производить арифметическую операцию с присвоением. Например, «+=» складывает текущее значение переменной слева с выражением справа и помещает результат в исходную переменную. Так же в некоторых языках и средах доступна совмещённая операция MulDiv, которая умножает на одно число, а потом делит результат на второе.
Обычно самыми дорогими по скорости операциями являются умножение и деление (получение остатка от деления).
В памяти компьютера для хранения целых чисел обычно отводится ячейки фиксированного объёма. Из-за этого операции увеличения и уменьшения значений могут приводить к переполнению, что оборачивается искажением результата. Некоторые языки программирования позволяют производит вызов исключения в таких случаях. Кроме этого можно определять поведение при переполнении:
- Циклическая операция (обычно происходит по умолчанию). Например, если сделать инкремент 8-битного беззнакового значения 255, то получится 0.
- Операция с насыщением. Если будет достигнут предел, то конечным значением будет это предельное. Например, если к 8-битному беззнаковому числу 250 прибавить 10, то получится 255. Сложение, вычитание и умножение с насыщением обычно применяется при работе с цветом.
Побитовые операции[править | править вики-текст]
Помимо математических, к целым числам применимы битовые операции, которые основаны на особенностях позиционного двоичного кодирования. Обычно они выполняются значительно быстрее арифметических операций и поэтому их используют как более оптимальные аналоги.
- Битовый сдвиг влево с дополнением нулями аналогичен умножению числа на степень двойки (количество бит сдвига соответствует степени двойки).
- Битовый сдвиг вправо аналогичен делению на степень двойки (количество бит сдвига соответствует степени двойки). Некоторые языки программирования и процессоры поддерживают арифметический сдвиг, который позволяет сохранять знак у целых со знаком (сохраняется значение старшего бита).
- У целых со знаком знак можно узнать по старшему биту (у отрицательных он установлен).
- Чтение и установка младшего бита позволяет управлять чётностью (у нечётных чисел он установлен).
- Побитовое «И» над определённым количеством младших бит позволяет узнать остаток от деления на степень двойки (степень соответствует количеству бит).
- Побитовое «ИЛИ» над определённым количеством младших бит и последующий инкремент округляет число на значение, равное степени двойки (степень соответствует количеству бит) — используется для выравнивания адресов и размеров на определённое значение.
Работа со строками[править | править вики-текст]
Довольно частыми операциями являются получение строки из числового значения во внутреннем представлении и обратно — число из строки. При преобразовании в строку обычно доступны средства задания форматирования в зависимости от языка пользователя.
Ниже перечислены некоторые из представлений чисел строкой.
- Десятичное число (англ. decimal). При получении строки обычно можно задать разделители разрядов, количество знаков (добавляются лидирующие нули если их меньше) и обязательное указание знака числа.
- Число в системе счисления, которое является степенью двойки. Самые частые: двоичное (binary англ. binary), восьмиричное (англ. octal) и шестнадцатиричное (англ. hexadecimal). При получении строки обычно можно задать разделители групп цифр и минимальное количество цифр (производится дополнение нулями, если их меньше). Так как эти представления чаще всего используются в программировании, то здесь обычно доступны соответствующие опции. Например, указание префикса и постфикса для получения значения в соответствии с синтаксисом языка. Для 16-ричных актуально указание регистра символов, а также обязательное добавление нуля, если первая цифра представлена буквой (чтобы число не определялось как строковый идентификатор).
- Римское число (англ. roman).
- Словесное представление (в том числе сумма прописью) — число представляется словами на указанном натуральном языке.
Перечислимый тип[править | править вики-текст]
К целым относится также перечислимый тип. Переменные перечислимого типа принимают конечный заранее заданный набор значений. Размер набора не определяется числом байтов, используемых для представления целочисленных значений переменных такого типа.
Например, в языке Python логический тип является подтипом целого и использует имена False и True, которые при приведении к целому получают значения 0 и 1 соответственно[6].
См. также[править | править вики-текст]
- Прямой код
- Обратный код
- Дополнительный код
- Арифметика произвольной точности
Примечания[править | править вики-текст]
- ↑ Бен-Ари, 2000, с. 54.
- ↑ Урок 7. Расширенные арифметические операции с целыми числами, Низкоуровневое программирование, СУНЦ НГУ
- ↑ Types, Values and Variables, Java Languaege Specification, 2-nd ed.
- ↑ «Нужны ли беззнаковые целые?» (22 января 2013)
- ↑ Hacker’s Delight, 2004, с. 215-221.
- ↑ Beazley, 2009, pp. 38.
Литература[править | править вики-текст]
- Основные определения цифровой и микропроцессорной техники, Система дистанционного обучения СПбГУ ИТМО, Программное обеспечение измерительных систем на базе универсальных компьютеров
- М. Бен-Ари. Глава 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.
- David M. Beazley. Python Essential Reference. — 4th Edition. — Addison-Wesley Professional, 2009. — 717 с. — ISBN 978-0672329784.
Типы данных |
|
---|---|
Неинтерпретируемые |
Бит • Ниббл • Байт • Кубит • Трит • Трайт • Слово |
Числовые |
Целый • С фиксированной запятой • С плавающей запятой • Рациональный • Комплексный • Длинный • Интервальный |
Текстовые |
Символьный • Строковый |
Ссылочные |
Адрес • Ссылка • Ссылка в С++ • Указатель • Обёртка |
Композитные |
Алгебраический тип данных (обобщённый) • Массив • Ассоциативный массив • Класс • Список • Тип-произведение ( Запись • Кортеж • Структура ) • Объект • Множество • Объединение (меченое) |
Другие |
Логический • Низший • Высший • Полиморфный • Функциональный • Перечисляемый • Коллекция • Исключение • Род (Метакласс) • Монада • Семафор • Поток • Void |
Связанные темы |
Абстрактный тип данных • Примитивный тип • Структура данных • Дженерик • Переменная типа • Интерфейс • Конструктор (ООП) • Конструктор (ФП) • Конструктор типов • Приведение типа • Система типов |
Типы данных в языке программирования Паскаль.
1. Целочисленный. Обозначается как integer. В данный тип данных входят числовые значение в диапазоне
[−32768…32767]
. В памяти компьютера для хранения таких данных отводится \(2\) байта со знаком.
2. Вещественный. Обозначается как real. Диапазон данных:
2.9∗10−39…1.7∗10+38
. Занимает \(6\) байтов в памяти компьютера.
3. Символьный. Обозначается как char. Значением переменной этого типа может быть любой символ алфавита. В памяти компьютера такая переменная займёт \(1\) байт.
4. Логический. Обозначается как boolean. Данный тип данных может принимать только два значения: истина или ложь.
Обрати внимание!
Действительные числа записываются с десятичной точкой.