Windows c типы данных

Обновлено: 04.07.2024

В C++ определены следующие основные целочисленные типы данных:

Эти типы данных представляют значения из множества целых чисел. Например:

Типы данных, которые начинаются с приставки unsigned , могут содержать только положительные числа.

Данные типа short int , unsigned short int занимают в два раза меньше места в памяти чем данные типа int , unsigned int . В последних версиях компилятора данные типа short int занимают 2 байта.

В более ранних версиях компиляторов данные типа long , unsigned long занимают в 2 раза больше места в памяти, чем данные типа int , unsigned int . В последних версиях компиляторов данные типа int ( unsigned int ) занимают такое же место в оперативной памяти как и данные типа long ( unsigned long ).

Данные типа long long ( unsigned long long ) занимают в 2 раза больше места в памяти чем данные типа long ( unsigned long ).

Пример. В примере определяется размер данных целочисленного типа с помощью инструкции sizeof . Более подробно об операторе sizeof можно прочитать здесь .

Результат выполнения программы:

Проанализировав результат, можно сделать вывод, что в ранних версиях компиляторов:

  • переменные типов short int и unsigned short int занимают 2 байта;
  • переменные типов int , unsigned int , long ( long int ), unsigned long ( unsigned long int ) занимают 4 байта;
  • переменные типов long long ( unsigned long long ) занимают 8 байт.

3. Как в программе описать переменную с именем x целого типа?

Ответ:

В результате под переменную x будет выделено место в памяти размером 4 байта. Размер памяти, которая выделяется под переменную зависит от характеристик компьютера, типа операционной системы и настроек компилятора.

4. Как в переменную целого типа записать число 239?

Ответ 1. Внесение числа в переменную после ее описания.

Ответ 2. Внесение числа в переменную во время ее описания (начальная инициализация).

5. Какие особенности типов данных с плавающей запятой?

Типы данных с плавающей запятой разрешают представлять значения из множества вещественных чисел. Например:

В C++ есть следующие базовые типы данных с плавающей запятой: float , double , long double .

Переменная типа double занимает в 2 раза больше места в памяти компьютера чем переменная типа float .

Так же переменная типа long double занимает в 2 раза больше места в памяти компьютера, чем переменная типа double .

6. Как описать переменную, которая принимает значение с плавающей запятой?

Пример описания переменных типа float , double , long double :

7. Как в переменную с плавающей запятой записать числовые значения?

Пример внесения числовых данных в переменные типы с плавающей запятой:

8. Как перевести переменную типа float в тип int ?

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

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

Например, переменная типа short int может представлять меньший диапазон чисел, чем переменные типов float , double . В следующему листинге происходит переполнение значения в переменной типа short int :

9. Как перевести переменную из типа int в тип double ?

Пример приведения с int в double :

10. Какие особенности использования данных типа char (символьных данных) в программе?

Данные типа char представляют символьное значение кода, введенного с клавиатуры. Код символа есть целое число.

Фрагмент кода, в котором вычисляется код символа:

Данные типа char есть теми же целыми числами. Данные типа char занимают в памяти компьютера 1 байт.

Символы с кодами от 128 до 255 – это региональные символы, которые привязанные к конкретной азбуке того компьютера на котором установленная операционная система Windows.

11. Какие особенности использования данных типа bool (логический тип)?

Переменные типа bool могут принимать только два значения:

Эти переменные используются для проверки логических выражений. Числовое значение true равно 1 . Числовое значение false равно 0 .

Фрагмент кода, который определяет числовые значения true и false :

Фрагмент кода, который превращает типы int и float в bool :

12. Как определить размер памяти, который занимает переменная данного типа?

Для этого используется операция sizeof() .

Фрагмент кода, который определяет размер некоторых типов данных:

13. Каким образом осуществляется инициализация переменных разных типов?

14. Каким образом определить максимально допустимое (минимально допустимое) значение переменной определенного типа?

Примеры определения предельных значений переменных разных типов.

Для переменных типа int :

Для переменных типа short int :

Для переменных типа unsigned int :

Для переменных типа float :

Для переменных типа double :

Для переменных типа char :

15. Какие особенности использования типа enum ?

Тип enum – это перечислительный тип данных. В нем задаются мнемонические значения для множеств целых значений. Каждое мнемоническое значение имеет определенное содержание и представляется целым числом.

Пример использования типа enum для обозначения месяцев года:

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

Можно написать и так:

16. Какие особенности применения типа void в программах на C++ ? Указатель на void

Тип данных void используется в следующих случаях:

  • если нужно описать функцию, которая не возвращает никакого значения (см. пример 1);
  • если нужно описать функцию, которая не получает параметров (см. пример 1);
  • когда нужно объявить указатель на void , который может взаимодействовать с указателями на другие типы (смотрите пример 2). В данном случае указатель на void может быть приведен к типу указателя на любой другой тип ( int* , float* , double* и т.д.).

Пример 1. Функция MyFun() без параметров, которая не возвращает никакого значения (возвращает тип void ) и не получает параметров.

Пример 2. В примере демонстрируются некоторые особенности использования указателя на void .

Результат выполнения программы

17. Можно ли объявлять переменную типа void в программе?

Однако можно объявить указатель на void .

18. Какие особенности применения типа wchar_t в Visual C++ ?

Тип wchar_t используется для сохранения символов, которые входят в состав больших символьных наборов. Например, в китайской азбуке есть огромное количество символов. 8 разрядов недостаточно, чтобы представить весь набор символов китайской азбуки. Поэтому, если нужно использовать программу на международном рынке, целесообразно заменить тип char на wchar_t .

Пример использования типа wchar_t .

19. Какой объем памяти резервируется для описания одной переменной типа wchar_t ?

Одна переменная типа wchar_t занимает в памяти компьютера 2 байта (16 бит). Диапазон целочисленных значений переменных типа wchar_t составляет от 0 до 65535.

20. Как определить, какое максимальное (минимальное) значение может содержать переменная целочисленного или символьного типа? Константы INT32_MIN , INT32_MAX и другие

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

Например, если переменная целого типа занимает 2 байта (16 бит), то диапазон допустимых значений может быть следующим:

В C++ существуют средства для определения минимального и максимального значения, которое может принимать переменная целочисленного или символьного типа. В библиотеку C++ входит модуль <limits.h> , который содержит описание соответствующих констант. Эти константы можно использовать в программах при перехвате различных исключительных ситуаций, например, переполнение, выход за допустимые пределы индекса в массиве и т.д.

Например, чтобы сравнить значение переменной типа int на максимум, можно использовать константу INT32_MAX по следующему образцу

Пример. Нижеследующий пример демонстрирует использование ограничительных констант для символьных и целочисленных типов.

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

Стандарт не требует, чтобы два разных типа имели разный размер: sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long) . Таким образом, даже типы char и long могут иметь одинаковый размер, но такие платформы очень редки. Стандарт гарантирует, что sizeof(char) всегда равен 1.

Минимальный диапазон значений целых типов по стандарту определяется с [math]-(2^N-1)[/math] по [math]2^N-1[/math] , где [math]N[/math] — разрядность типа. Реализация компиляторов может расширять этот диапазон по своему усмотрению. Отметим, что такие ограничения позволяют использовать то или иное представление знаковых чисел:

  • дополнительный код (two’s complement) — для отрицательного числа код можно получить инвертированием его двоичного модуля и прибавлением к инверсии единицы
  • обратный код (ones’ complement) — двоичный код отрицательного целого числа состоит из одноразрядного кода знака (двоичной цифры 1), за которым следует ( [math]n−1[/math] )-разрядное двоичное число, представляющее собой инвертированное ( [math]n−1[/math] )-разрядное представление модуля числа
  • прямой код (sign and magnitude method) — знаковый бит и затем модуль числа без инвертирования.

Отдельное внимание стоит уделить типу char . Формально это отдельный тип, но фактически char эквивалентен либо signed char , либо unsigned char , в зависимости от компилятора.

Для того, чтобы избежать путаницы между размерами типов стандарт C99 ввел новые типы данных, описанные в файле stdint.h. Среди них такие типы как: intN_t , int_leastN_t , int_fastN_t , где N = 8, 16, 32 или 64. Приставка least- обозначает минимальный тип, способный вместить N бит, приставка fast- обозначает тип размером не менее 16 бит, работа с которым наиболее быстрая на данной платформе. Типы без приставок обозначают типы с фиксированном размером, равным N бит.

Типы с приставками least- и fast- можно считать заменой типам int , short , long , с той лишь разницей, что первые дают программисту выбрать между скоростью и размером.

Ошибки

Memsize-типы

Для представления величин, связанных с памятью, в C есть typedef'ы size_t и ptrdiff_t. Размер определяется архитектурой процессора.

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

Оператор sizeof возвращает результат типа size_t. Для size_t гарантируется, что он как минимум 16-битный.

Тип ptrdiff_t знаковый, используется для хранения разности указателей. Стандартом допускается вычисление разности только для указателей одного типа, для разных типов — зависит от реализации.

Модели данных

Под моделью данных следует понимать соотношения размерностей типов, принятых в рамках среды разработки на С.

Примеры приведены в таблице.

Data-model.jpg

Вещественные типы

Стандартом гарантируется только, что sizeof(float) <= sizeof(double) <= sizeof(long double) .

На большинстве платформ применяются типы с плавающей точкой в соответствии со стандартом IEEE 754.

Логический тип

В языке C в стандарте C99 введён тип _Bool.

Массивы

Для каждого типа T, кроме void и типов функций, существует тип «массив из элементов N типа T». Массив - это коллекция значений одного типа, хранящихся последовательно в памяти. Массив размера N индексируется целым числом от 0 до N-1.

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

В C99 добавлены динамические многомерные массивы:

Указатели

Для любого типа T существует тип «указатель на T».

Переменные могут быть объявлены как указатели на значения различных типов с помощью символа * . Для того чтобы определить тип переменной как указатель, нужно предварить её имя звёздочкой.

Существуют также указатели на массивы и на функции. Указатели на массивы имеют следующий синтаксис:

Структуры

Композитный тип данных, инкапсулирующий без сокрытия набор значений различных типов.

При инициализации элементов структуры надо иметь в виду следующий момент:

If there are fewer initializers in a brace-enclosed list than there are elements or members of an aggregate, or fewer characters in a string literal used to initialize an array of known size than there are elements in the array, the remainder of the aggregate shall be initialized implicitly the same as objects that have static storage duration.

Важное отличие между С и C++.

В C++ можно писать

В C нужно писать

Так сделано специально. Названия структур находятся в отдельном пространстве имён. Их всего четыре вида:

  • названия меток (для goto);
  • теги (названия структур, объединений, перечислений);
  • члены структур и объединений;
  • все прочие идентификаторы.

Это позволяет, например, назвать переменную так же, как называется структура.

Или же можно сделать typedef:

Доступ к элементам структуры осуществляется с помощью оператора .. Для обращения к полям структуры по указателю существует оператор «стрелочка» ->, синонимичный предыдущей записи: (*p).x — то же самое, что и p->x.

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

Структуры не всегда занимают число байт, равное сумме байт их элементов. Компилятор обычно выравнивает элементы. The Lost Art of C Structure Packing

Адрес памяти первого поля структуры равен адресу самой структуры.

Объединения

Доступ к одним и тем же данным разными способами:

Т. н. type punning (каламбур типизации)

Стандартом C99 это разрешается (в отличие от приведения указателей разных типов).

If the member used to read the contents of a union object is not the same as the member last used to store a value in the object, the appropriate part of the object representation of the value is reinterpreted as an object representation in the new type as described in 6.2.6 (a process sometimes called ‘‘type punning’’). This might be a trap representation.

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

В Си/Си++ имеется четыре базовых арифметических (число­вых) типа данных. Из них два целочисленных — char, int — и два плавающих (вещественных) — float и double. Кроме того, в программах можно использовать некоторые модификации этих ти­пов, описываемых с помощью служебных слов — модификаторов. Существуют два модификатора размера — short (короткий) и long (длинный) — и два модификатора знаков — signed (знако­вый) и unsigned (беззнаковый). Знаковые модификаторы при­меняются только к целым типам.

Как известно, тип величины связан с ее формой внутреннего представления, множеством принимаемых значений и множеством операций, применимых к этой величине. В табл. 1 перечислены арифметические типы данных Си++, указан объем занимаемой памяти и диапазон допустимых значений.

Размер типа int и unsigned int зависит от размера слова операционной системы, в которой работает компилятор Си++. В 16-разрядных ОС (MS DOS) этим типам соответствуют 2 байта, в 32-разрядных (Windows) — 4 байта.


Эквивалентные названия типа

зависит от системы

signed, signed int

зависит от системы

short, signed short int

unsigned short int

long, signed long int

unsigned long int

Анализируя данные табл. 1, можно сделать следующие выводы:

o если не указан базовый тип, то по умолчанию подразумевается int;

o если не указан модификатор знаков, то по умолчанию подра­зумевается signed;

o с базовым типом float модификаторы не употребляются;

o модификатор short применим только к базовому типу int.

Программисту, работавшему на Паскале, покажется странным, что тип char причислен к арифметическим типам. Ведь даже его имя указывает на то, что это символьный тип! В Си/Си++ вели­чины типа char могут рассматриваться в программе и как симво­лы, и как целые числа. Все зависит от контекста, т. е. от способа использования этой величины. В случае интерпретации величины типа char как символа ее числовое значение является ASCII-кодом. Следующий пример иллюстрирует сказанное.

printf("%c",а); /*На экране появится символ А*/

printf("%d",a); /*На экране появится число 65*/

Символы "%с" являются спецификацией формата ввода/выво­да символьных данных, a "%d" — спецификацией для целых чисел.

Еще одной особенностью Си является отсутствие среди базовых типов логического типа данных. Между тем, как мы дальше увидим, в Си использу­ются логические операции и логические выражения. В качестве логических величин в Си/Си++ выступают целые числа. Интер­претация их значений в логические величины происходит по пра­вилу: равно нулю — ложь, не равно нулю — истина.

В последние версии Си++ добавлен отдельный логический тип с именем bool. Его относят к разновидности целых типов данных.

Описание переменных в программах на Си/Си++ имеет вид:

unsigned char code;

unsigned long long number;

long double max__num;

Одновременно с описанием можно задать начальные значения переменных. Такое действие называется инициализацией перемен­ных. Описание с инициализацией производится по следующей схеме:

тип имя_переменной = начальное_значение

unsigned int year=2 000;

Запись целых констант. Целые десятичные числа , начинающиеся не с нуля, например: 4, 356, —128.

Целые восьмеричные числа , запись которых начинается с нуля, например: 016, 077.

Целые шестнадцатеричные числа , запись которых начинается с символов 0х, например: 0xlA, 0x253, 0xFFFF.

Тип константы компилятор определяет по следующим пра­вилам: если значение константы лежит в диапазоне типа int, то она получает тип int; в противном случае проверяется, ле­жит ли константа в диапазоне типа unsigned int, в случае положительного ответа она получает этот тип; если не подхо­дит и он, то пробуется тип long и, наконец, unsigned long. Если значение числа не укладывается в диапазон типа unsigned long, то возникает ошибка компиляции.

Запись вещественных констант . Если в записи числовой кон­станты присутствует десятичная точка (2.5) или экспоненциаль­ное расширение (1E-8), то компилятор рассматривает ее как ве­щественное число и ставит ей в соответствие тип double. Приме­ры вещественных констант: 44., 3.14159, 44Е0, 1.5Е-4.

Использование суффиксов . Программист может явно задать тип константы, используя для этого суффиксы. Существуют три вида суффиксов: F (f) - float; U(u) — unsigned; L( l ) — long (для целых и вещественных констант). Кроме того, допускается совмес­тное использование суффиксов и и L в вариантах U L или LU.

3.14159F — константа типа float, под которую выделяется 4 байта памяти;

3.14L — константа типа long double, занимает 10 байт;

50000U — константа типа unsigned int, занимает 2 байта памяти (вместо четырех без суффикса);

0LU — константа типа unsigned long, занимает 4 байта;

24242424UL — константа типа unsigned long, занимает 4 байта.

Запись символьных и строковых констант. Символьные констан­ты заключаются в апострофы. Например: ‘ А ’ , ‘ а ’ , ‘ 5 ’ , ‘ + ’ . Стро­ковые константы, представляющие собой символьные последова­тельности, заключаются в двойные кавычки. Например: "rezult", "введите исходные данные".

Особую разновидность символьных констант представляют так называемые управляющие символы. Их назначение — управление выводом на экран. Как известно, такие символы расположены в начальной части кодовой таблицы ASCII (коды от 0 до 31) и не имеют графического представления. В программе на Си они изоб­ражаются парой символов, первый из которых ' \ '. Вот некото­рые из управляющих символов:

' \ n ' — переход на новую строку;

‘ \t' — горизонтальная табуляция;

'\а' - подача звукового сигнала. Полный список управляю­щих символьных последовательностей будет дан позднее.

Управляющие символьные последовательности являются частным случаем эскейп-последовательностей (ESC-sequence), с помощью которых можно задать символьную константу указанием ее кода. Код символа можно указать в восьмеричном или в шестнадцатеричном представлении. Формат восьмеричного представления: '\ddd'. Здесь d — восьмеричная цифра (от 0 до 7). Формат шестнадцатеричного представления:' \xhh' (или ' \xhh'), где h — шестнадцатеричная цифра (от 0 до F). Например, константа, соответствующая заглав­ной латинской букве А, может быть представлена тремя способа­ми: 'А', '\101', ‘\х41’.

Именованные константы (константные переменные) . В программе на Си/Си++ могут использоваться имено­ванные константы. Употребляемое для их определения служебное слово const принято называть квалификатором доступа. Квалификатор const указывает на то, что данная величина не может изменяться в течение всего времени работы программы. В частно­сти, она не может располагаться в левой части оператора присва­ивания. Примеры описания константных переменных:

const float pi=3.14159;

const int iMIN=l, iMAX=1000;

Тип констант явно не указывается и определяется по форме записи. В конце директивы не ставится точка с запятой.

На стадии препроцессорной обработки указанные имена заме­няются на соответствующие значения. Например, если в програм­ме присутствует оператор

то в результате препроцессорной обработки он примет вид:

При этом идентификаторы iMAX и iMIN не требуют описания внутри программы.

Константы перечисляемого типа . Данное средство языка по­зволяет определять последовательность целочисленных именован­ных констант. Описание перечисляемого типа начинается со слу­жебного слова enum, а последующий список констант заключает­ся в фигурные скобки. Например:

В результате имени А будет сопоставлена константа 0, имени B — константа 1, C — 2, D — 3. По умолчанию значение первой константы равно нулю.

Для любой константы можно явно указать значение. Например:

В результате будут установлены следующие соответствия: А=10, B=11, C=12, D=13.

Возможен и такой вариант определения перечисления:

Если перечисляемому типу дать имя, то его можно использо­вать в описании переменных. На­пример:

metal Met 1 ,Met2;

Здесь идентификатор metal становится именем типа. После та­кого описания в программе возможны следующие операторы:

К данным относится любая информация, представленная в таком виде, который позволяет автоматизировать её сбор, хранение и обработку в ЭВМ (числа, символы, биты и др.).
Данные в программе могут быть исходными (задаваемыми на входе программы) или результатами обработки (промежуточными или выходными).
Все данные - переменные и константы - принадлежат определенному типу.
С каждым типом данных связан свой диапазон значений ( количество байт под одно значение) и допустимые операции.


  1. void (пустой тип),
  2. int (целый тип),
  3. float (вещественные числа с плавающей точкой),
  4. double (вещественные числа с плавающей точкой двойной точности),
  5. char (символьный тип),
  6. bool - логический.

Составные типы

  1. short - короткий;
  2. long - длинный;
  3. signed-знаковый;
  4. unsigned-беззнаковый.
  • массивы,
  • функции,
  • классы,
  • указатели,
  • ссылки,
  • структуры ,
  • объединения.

Символьный тип

Целочисленный тип

Данные типа int в памяти компьютера могут занимать либо 2, 4 или 8 байт. Это зависит от разрядности процессора.
По умолчанию все целые типы считаются знаковыми, то есть спецификатор signed (знаковый ) можно не указывать.
Спецификатор unsigned (беззнаковый) позволяет представлять только положительные числа.

Диапазоны значений целочисленных типов

Тип данных Диапазон значений Размер(байт)
int
signed int
signed long int
-2147483648 . 2147483647 4
unsigned int
unsigned long int
0 . 4294967295 4
short int
signed short int
-32768 . 32767 2
unsigned short int 0. 65535 2
long long int \(-(2^-1). (2^-1)\) 8
unsigned long
long int
\(0. (2^-1)\) 8

Вещественный тип

Диапазоны значений вещественных типов

Логический тип

Переменная типа bool может принимать только два значения true (истина) или false (ложь). Любое значение, не равное нулю, интерпретируется как true, а при преобразовании к целому типу принимает значение, равное 1. Значение false представлено в памяти как 0.

Читайте также: