long double c что это

Урок №33. Типы данных с плавающей точкой: float, double и long double

Обновл. 11 Сен 2021 |

Типы данных с плавающей точкой

Есть три типа данных с плавающей точкой: float, double и long double. Язык C++ определяет только их минимальный размер (как и с целочисленными типами). Типы данных с плавающей точкой всегда являются signed (т.е. могут хранить как положительные, так и отрицательные числа).

Тип Минимальный размер Типичный размер
Тип данных с плавающей точкойfloat4 байта4 байта
double8 байт8 байт
long double8 байт8, 12 или 16 байт

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

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

Обратите внимание, литералы типа с плавающей точкой по умолчанию относятся к типу double. f в конце числа означает тип float.

Экспоненциальная запись

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

На практике экспоненциальная запись может использоваться в операциях присваивания следующим образом:

Источник

Встроенные типы (C++)

Встроенные типы (также называемые фундаментальными типами) задаются стандартом языка C++ и встроены в компилятор. Встроенные типы не определены в файле заголовка. Встроенные типы делятся на три основные категории: целые, с плавающей запятойи void. Целочисленные типы представляют целые числа. Типы с плавающей запятой могут указывать значения, которые могут содержать дробные части. Большинство встроенных типов рассматриваются компилятором как отдельные типы. Однако некоторые типы являются синонимамиили обрабатываются компилятором как эквивалентные типы.

Тип void

в операторе выражения (Дополнительные сведения см. в разделе выражения.)

в левом операнде оператора запятой (Дополнительные сведения см. в разделе оператор-запятая.)

std:: nullptr_t

Тип Boolean

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

Зависящие от Майкрософт: переменные типа помещаются в int тип по signed char умолчанию, если не /J используется параметр компиляции. В этом случае они рассматриваются как тип unsigned char и переносятся в int без расширения знака.

Переменная типа wchar_t является расширенным символом или типом многобайтового символа. Используйте L префикс перед символьным или строковым литералом, чтобы указать тип расширенных символов.

char16_t Тип используется для символьного представления UTF-16. Он должен быть достаточно большим, чтобы представлять любой блок кода UTF-16. Компилятор обрабатывает его как отдельный тип.

char32_t Тип используется для символьного представления UTF-32. Он должен быть достаточно большим, чтобы представлять любую единицу кода UTF-32. Компилятор обрабатывает его как отдельный тип.

Типы с плавающей запятой

Типы с плавающей запятой используют представление IEEE-754, чтобы обеспечить приближение дробных значений к широкому диапазону величин. В следующей таблице перечислены типы с плавающей запятой в C++ и сравнительные ограничения размеров типов с плавающей запятой. Эти ограничения задаются стандартом C++ и не зависят от реализации Майкрософт. Абсолютный размер встроенных типов с плавающей запятой не указан в стандарте.

Конкретно для Майкрософт: представление и double идентично. Однако long double double компилятор обрабатывает как отдельные типы. Компилятор Microsoft C++ использует 4-и 8-байтовые представления с плавающей запятой в формате IEEE-754. Дополнительные сведения см. в разделе IEEE с плавающей точкой.

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

int Тип является базовым целочисленным типом по умолчанию. Он может представлять все целые числа в диапазоне, зависящем от реализации.

Представление целого числа со знаком — это одно из значений, которое может содержать положительные и отрицательные значения. Он используется по умолчанию или при signed наличии ключевого слова модификатор. unsigned Ключевое слово модификатор задает unsigned представление, которое может содержать только неотрицательные значения.

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

int Ключевое слово можно опустить, если signed unsigned заданы модификаторы, или. Модификаторы и int тип, если они есть, могут использоваться в любом порядке. Например, short unsigned и unsigned int short следует ссылаться на один и тот же тип.

Синонимы целочисленного типа

Компилятор считает синонимами следующие группы типов:

Размеры встроенных типов

Большинство встроенных типов имеют размеры, определенные реализацией. В следующей таблице перечислены объемы хранилища, необходимые для встроенных типов в Microsoft C++. В частности, long имеет 4 байта даже в 64-разрядных операционных системах.

Дополнительные сведения о преобразовании типов см. в разделе стандартные преобразования.

Источник

Типы данных в языке C++

Основные типы данных

Базовые типы данных

Модификации базовых типов данных

Дополнительные символьные типы

Автоматическое назначение типа

Примечания

Для вывода на консоль символов wchar_t следует использовать не std::cout, а поток std::wcout. При этом поток std::wcout может работать как с char, так и с wchar_t. А поток std::cout для переменной wchar_t вместо символа будет выводить его числовой код.

В стандарте С++11 были добавлены типы char16_t и char32_t, которые ориентированы на использование Unicode. Однако на уровне ОС пока не реализованы потоки для работы с этими типами. Поэтому если потребуется вывести на консоль значения переменных этих типов, то необходимо преобразовать переменные к типам char или wchar_t.

Преобразование типов

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

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

Неявное преобразование типов

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

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

Арифметические выражения

При обработке выражений компилятор разбивает каждое выражение на отдельные подвыражения. Арифметические операторы требуют, чтобы их операнды были одного типа данных. Чтобы это гарантировать, компилятор использует следующие правила:

Приоритет типов операндов для арифметических операций:

Явное преобразование типов

В языке C++ есть 5 видов операций явного преобразования типов:

Конвертация в стиле языка C

В программировании на языке Cи явное преобразование типов данных выполняется с помощью оператора ( ).

Язык C++ также позволяет использовать этот оператор следующим образом:

Конвертация в стиле языка C не проверяется компилятором, поэтому она может быть неправильно использована, например привести к переполнению.

Операция static_cast

Операция static_cast в языке C++ осуществляет явное и допустимое приведение заданного выражения в указанный тип данных. Операция static_cast аналогична операции «круглые скобки» с одним исключением: она не выполняет приведение указателей на неродственные типы (для этого применяется операция reinterpret_cast). Основным преимуществом операции static_cast является проверка выполнения компилятором во время компиляции с генерацией предупреждений, что усложняет возможность возникновения ошибок.

Операция dynamic_cast

В языке C++ операция dynamic_cast используется для конвертации указателей родительского класса в указатели дочернего класса. Это является наиболее распространенным применением оператора dynamic_cast.Этот процесс называется приведением к дочернему типу (или «понижающим приведением типа»).

Если dynamic_cast не может выполнить конвертацию, то он возвращает нулевой указатель, поэтому нужно делать проверку результата динамического приведения на нулевой указатель. Оператор dynamic_cast также может использоваться и со ссылками. Работа dynamic_cast со ссылками аналогична работе с указателями, но поскольку в языке C++ не существует «нулевой ссылки», то dynamic_cast не может возвратить «нулевую ссылку» при сбое. Вместо этого dynamic_cast генерирует исключение типа std::bad_cast.

Поскольку динамическое приведение выполняет проверку во время работы программы, использование оператора dynamic_cast немного снижает производительность. Понижающее приведение также может быть выполнено и через оператор static_cast. Основное отличие заключается в том, что static_cast не выполняет проверку во время запуска программы. Это позволяет оператору static_cast быть быстрее, но опаснее оператора dynamic_cast.

Существуют случаи, в которых понижающее приведение с использованием оператора dynamic_cast не работает:

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

Операция const_cast

Операция const_cast используется для снятия/установки модификаторов const, volatile, mutable. Часто это применяется, чтобы обойти неудачную архитектуру программы или библиотеки, для стыковки С и С++, для передачи информации через обобщённые указатели void*, для одновременного написания const- и не-const-версии функции.

Операцию const_cast для сброса const следует использовать только в крайних случаях, когда точно известно поведение программы. А вот использование операции const_cast ради добавления константности можно использовать без опасений получить неопределенное поведение.

При использовании операции const_cast выражение должно быть ссылкой или указателем, а тип должен совпадать с исходным типом вплоть до модификаторов const, volatile и mutable.

Операция reinterpret_cast

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

Является функционально усеченным аналогом приведения типов в стиле языка С.

Отличие состоит в том, что reinterpret_cast не может снимать квалификаторы const и volatile, а также не может делать небезопасное приведение типов не через указатели, а напрямую по значению. Например, переменную типа int к переменной типа double привести при помощи reinterpret_cast нельзя.

Источник

Типы с плавающей точкой (float, double и long double)

Целый тип (int)

Размер типа int не определяется стандартом, а зависит от компьютера и компилятора.

Для 16-разрядного процессора под величины этого типа отводится 2 байта,

для 32-разрядного — 4 байта.

Спецификатор short перед именем типа указывает компилятору, что под число требуется отвести 2 байта независимо от разрядности процессора.

Спецификатор long означает, что целая величина будет занимать 4 байта.

Таким образом, на 16-разрядном компьютере эквиваленты int и short int,

а на 32-разрядном — int и long int.

Внутреннее представление величины целого типа — целое число в двоичном коде. При использовании спецификатора signed старший бит числа интерпретируется как знаковый (0 — положительное число, 1 — отрицательное). Спецификатор unsigned позволяет представлять только положительные числа, поскольку старший разряд рассматривается как часть кода числа. Т. о., диапазон значений типа int зависит от спецификаторов. Диапазоны значений величин целого типа с различными спецификаторами для IBM PC-совместимых компьютеров приведены в таблице «Диапазоны значений простых типов данных».

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

Константам, встречающимся в программе, приписывается тот или иной тип в соответствии с их видом. Если он по каким-либо причинам не устраивает программиста, моно явно указать требуемый тип с помощью суффиксов L, l (long) и U, u (unsigned). Например, константа 32L будет иметь тип long и занимать 4 байта. Можно использовать суффиксы L и U одновременно, например, 0x22UL или 05Lu.

Примечание.Типы short int, long int, signed int и unsigned int можно сокращать до short, long, signed и unsigned соответственно.

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

Расширенный символьный тип (wchar_t)

Тип wchar_t предназначен для работы с набором символов, для кодировки которых недостаточно 1 байта. Например, Unicode. Размер этого типа зависит от реализации; как правило, он соответствует типу short. Строковые константы типа wchar_t записываются с префиксом L, например, L“Gates”.

Логический тип (bool)

Величины логического типа могут принимать только значения true и false, являющиеся зарезервированными словами. Внутренняя форма представления значения false — 0 (нуль). Любое другое значение интерпретируется как true. При преобразовании к целому типу trueимеет значение 1.

Типы с плавающей точкой (float, double и long double)

Стандарт C++ определяет три типа данных для хранения вещественных значений: float, double и long double.

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

В IBM PC-совместимых компьютерах величины типа floatзанимают 4 байта, из которых один двоичный разряд отводится под знак мантиссы, 8 разрядов под порядок и 23 под мантиссу. Мантисса — это число, большее 1.0, но меньшее 2.0. Поскольку старшая цифра мантиссы всегда равна 1, она не хранится.

Для величин типа double, занимающих 8 байт, под порядок и мантиссу отводится 11 и 52 разряда соответственно. Длина мантиссы определяет точность числа, а длина порядка — его диапазон. Как можно видеть из таблицы в конце записи, при одинаковом количестве байт, отводимом под величины типа float и long int, диапазоны их допустимых значений сильно различаются из-за внутренней формы представления.

Спецификатор longперед именем типа doubleуказывает, что под его величину отводится 10 байт.

Константы с плавающей точкой имеют по умолчанию тип double. Можно явно указать тип константы с помощью суффиксов F, f (float) и L, l (long).

Например, константа 2E+6L будет иметь тип long double, а константа 1.82f — тип float.

При написании универсальных для разных платформ программ нельзя делать допущений о размере типа int. Для его получения необходимо пользоваться операцией sizeof, результатом которой является размер типа в байтах.

Например, для операционной системы MS-DOS sizeof (int) даст в результате 2, а для Windows 98 или OS/2 результатом будет 4.

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

sizeof(float) ≤ slzeof(double) ≤ sizeof(long double)
sizeof(char) ≤ slzeof(short) ≤ sizeof(int) ≤ sizeof(long)

Тип void

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

Различные виды целых и вещественных типов, различающиеся диапазоном и точностью представления данных, введены для того, чтобы дать программисту возможность наиболее эффективно использовать возможности конкретной аппаратуры, поскольку от выбора типа зависит скорость вычислений и объем памяти. Но оптимизированная для компьютеров какого-либо одного типа программа может стать не переносимой на другие платформы, поэтому в общем случае следует избегать зависимостей от конкретных характеристик типов данных.

ТипДиапазон значенийРазмер (байт)
booltrue и false
signed char-128 … 127
unsigned char0 … 255
signed short int-32 768 … 32 767
unsigned short int0 … 65 535
signed long int-2 147 483 648 … 2 147 483 647
unsigned long int0 … 4 294 967 295
float3.4e-38 … 3.4e+38
double1.7e-308 … 1.7C+308
long double3.4e-4932 … 3.4e+4932

Структура программы

Программа на языке С++ состоит из функций, описаний и директив препроцессора. Одна из функций должна иметь имя main. Выполнение программы начинается с первого оператора этой функции. Простейшее определение функции имеет следующий формат:

Как правило, функция используется для вычисления какого-либо значения, поэтому перед именем функции указывается его тип. Ниже приведены самые необходимые сведения о функциях:

Пример структуры программы, содержащей функции main, fl и f2:

1. 2. 3. 4. 5. 6. 7. 8. 9. 10 11директивы препроцессора описания int main() < операторы главной функции >int fl() < операторы функции fl >int f2()

Программа может состоять из нескольких модулей (исходных файлов).

Замечания о вводе/выводе в C++

В языке С++ нет встроенных средств ввода/вывода — он осуществляется с помощью функций, типов и объектов, содержащихся в стандартных библиотеках.

Используется два способа: функции, унаследованные из языка С, и объекты С++.

Основные функции ввода/вывода в стиле С:

Они выполняют форматированный ввод и вывод произвольного количества величин в соответствии со строкой формата format. Строка формата содержит символы, которые при выводе копируются в поток (на экран) или запрашиваются из потока (с клавиатуры) при вводе, и спецификации преобразования, начинающиеся со знака %, которые при вводе и выводе заменяются конкретными величинами.

Пример программы, использующей функции ввода/вывода в стиле С:

#include
int main() <
int i;
printf(«Введите целое число\п»);
scanf(«%d», &i);
printf(«Вы ввели число %d, спасибо!», i);
return 0;
>

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

Третья строка — описание переменной целого типа с именем i.

Функция printf в четвертой строке выводит приглашение «Введите целое число» и переходит на новую строку в соответствии с управляющей последовательностью \n. Функция scanf заносит введенное с клавиатуры целое число в переменную i (знак & означает операцию получения адреса), а следующий оператор выводит на экран указанную в нем строку, заменив спецификацию преобразования на значение этого числа.

Программа с использованием библиотеки классов С++:

#include
int main() <
int i;
cout > i;
cout >.

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

Источник

Курс C с нуля: часть 3 – типы данных

С – типы данных

В C имеется четыре основных группы типов данных

Типы
1базовые типыint, char, float, double
2перечисленияenum
3производные типыpointer, array, structure, union
4тип voidvoid

1. Базовые типы данных в C

1.1. тип данных integer

Примечание :

1.2. тип данных character:

1.3. тип данных floating point :

Тип данных с плавающей точкой может быть двух видов:

1. float :

2. double :

1.3.1. функция sizeof() :

Функция sizeof() используется для получения размера памяти, выделяемой для типа данных на конкретной машине.

1.3.2. модификаторы типов данных в C :

В C имеется 5 типов модификаторов типов данных:

В таблице ниже представлены возможные комбинации и размеры памяти, выделяемой при использовании различных типов данных:

S.NoC Data typesstorage SizeRange
1char1–127 to 127
2int2–32,767 to 32,767
3float41E–37 to 1E+37 with six digits of precision
4double81E–37 to 1E+37 with ten digits of precision
5long double101E–37 to 1E+37 with ten digits of precision
6long int4–2,147,483,647 to 2,147,483,647
7short int2–32,767 to 32,767
8unsigned short int20 to 65,535
9signed short int /td>2–32,767 to 32,767
10long long int8–(2power(63) –1) to 2(power)63 –1
11signed long int4–2,147,483,647 to 2,147,483,647
12unsigned long int40 to 4,294,967,295
13unsigned long long int82(power)64 –1

2. перечисляемый тип данных в C:

Синтаксис перечислений выглядит так:

Аналогично можно использовать директиву препроцессора #define :

C – enum пример программы:

Результат ее работы:

Массивы, указатели, структуры и объединения (unions) называются “производными типами данных”, и будут рассмотрены позже.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *