What is float, double, long double ?
To store numbers in a computer, an algorithm must be used. The C standard does not specify the algorithm, or the encoding to be used , for storing any kind of numbers, be it rational such as 1/2 , integer such as 5 or irrational such as pi .
It only specifies the name of the numerical data types, such as int , or float . Their meaning, for example int is used to store signed integer types , like -1 or 1 , and float is used to store approximation of real numbers such as 1.2 or -12.5 . Their minimum range, for example the minimum range of the int type is between -32767 and +32767 . The algorithms to encode numbers are specified by computer manufacturer.
The real types in C are the float , double , and long double . The C standard defines the model of real numbers that must be encoded , this model is called the floating point model , and it has the following format :
Multiple algorithms exist for encoding floating points , the most commonly used one is the IEEE floating point format .
On computers , that uses the IEEE floating point format algorithm , the float type maps to the IEEE single precision floating point , and the double type maps to the IEEE double precision floating point. The long double maps either to the IEEE quadruple precision floating point format, or the IEEE 80 bit floating point format.
The ranges of the C real types, when using the IEEE floating point format is as follow.
The float.h header , contain information related to floating point implementations, such as the absolute value of the range [min, max] for each of the floating types , and the closest value to 0 .
The type in which floating point arithmetic operations are performed , is defined in the macro FLT_EVAL_METHOD , defined in the header float.h .
If FLT_EVAL_METHOD value is set to 2 , then arithmetic operations are performed by promoting the operands to the long double type . If FLT_EVAL_METHOD is set to 1 , then arithmetic operations are performed by promoting the operands to long double , if any operand is of the long double type , otherwise operands are promoted to the double type , even if both operands are of the float type . If FLT_EVAL_METHOD is set to 0 , then arithmetic operations are done in the type of the widest operand. If FLT_EVAL_METHOD is set to -1 , then it is indeterminable.
Floating point literal
A floating point literal in C , can be written in decimal , in one of the following format :
where d is any digit between 0-9 , + means one or more, * means zero or more , what is between [] is optional , and e is case insensitive, and means an exponent of the number 10. As an example :
By default the type of a floating point literal in C, is the double type , unless suffixed with f , case insensitive, in this case it will be of the float type, or suffixed with l , case insensitive, in this case it will be of the long double type. As an example :
A floating point literal, can also be written in hexadecimal notation
Where 0x is case insensitive , and stands for hexadecimal, h is an hexadecimal digit between 0-F , + means one or more, what is between [] is optional, * means zero or more, and P is case insensitive , and means 2 to the power p , and d is one or more digits between 0-9 . As an example :
As with decimal floating point constant , hexadecimal floating point constant has a default type of double . To provide the hexadecimal floating point constant , a type of float , use the suffix f , case insensitive, and to give it the type of long double , use the suffix l , case insensitive. As an example :
Float c что это
unsigned long long
Определение чисел в различных системах
Си позволяет определять числа в разных числовых системых. Числа в двоичной системе начинаются с символов 0b , после которых идет набор 1 и 0, которые представляют число. Восьмеричные числа начинаются с числа 0, за которым могут идти цифры от 0 до 7. Щестнадцатеричные числа начинаются с 0x или 0X , за которыми следуют шестнадцатеричные цифры от 0 до 9 и от A до F. Например:
В данном случае определены четыре переменных, но каждая из них хранит одно и то же число — 11, записанное в разных системах исчисления.
Числа с плавающей точкой
Числа с плавающей точкой представлены тремя типами: float , double , long double . В качестве разделителя между целой и дробной частями применяется точка. По умолчанию все дробные числа представляют тип double , который занимает 8 байт:
Для вывода значения double на консоль используется спецификаторы f и lf . Чтобы указать, что число представляет тип float , применяется суффикс f , а для long double — суффикс l :
Стоит отметить, что для вывода данных типа long double на консоль применяется спецификатор Lf , однако на некоторых платформах он может работать некорректно, например, показывать 0.
Символы
Переменным типа char можно присвоить один символ в одинарных кавычках:
Здесь определяется переменная letter, которая хранит символ ‘A’. Однако в реальности переменная типа char хранит число. И когда переменной присваивается символ, она получает числовой код этого символа из таблицы, которая сопоставляет числовые коды и символы. Наиболее распространена таблица ASCII. Она сопоставляет символы с числами от 0 до 127. Но есть и другие таблицы, которые, как правило, эту таблицу ASCII. Например, возьмем выше определенную переменную letter и выведем ее содержимое на консоль:
Числовой код символа ‘A’ в таблице ASCII равен 65. Для наглядности в программе два раза выводим значение переменной letter. Но в первом случае используем спецификатор %d для вывода числового кода символа, а во втором случае применяется спецификатор %c , который позволяет вывести на консоль сам символ. То есть при выполнении программа выведет на консоль:
Вместо символа в одинарных кавычках мы могли бы присвоить напрямую числовой код:
И мы получили бы тот же самый результат.
typedef
Оператор typedef позволяет для определенного типа псевдоним. Это может потребоваться, например, когда название некоторого типа довольно большое, и мы хотим его сократить.
Общая форма оператора
Например, зададим для типа unsigned char псевдоним BYTE :
И мы сможем использовать этот тип как и любой другой:
Размер типов данных
В выше приведенном списке для каждого типа указан размер, который он занимает в памяти. Однако стоит отметить, что предельные размеры для типов разработчики компиляторов могут выбирать самостоятельно, исходя из аппаратных возможностей компьютера. Стандарт устанавливает лишь минимальные значения, которые должны быть. Например, для типов int и short минимальное значение — 16 бит, для типа long — 32 бита. При этом размер типа long должен быть не меньше размера типа int, а размер типа int — не меньше размера типа short. Но в целом для типов используются те размеры, которые указаны выше при описании типов данных.
Однако бывают ситуации, когда необходимо точно знать размер определенного типа. И для этого в C есть оператор sizeof() , который возвращает размер памяти в байтах, которую занимает переменная:
При этом при определении переменных важно понимать, что значение переменной не должно выходить за те пределы, которые очерчены для ее типа. Например:
Компилятор GCC при компиляции программы с этой строкой выдаст ошибку о том, что значение -65535 не входит в диапазон допустимых значений для типа unsigned short int.
C Float
Summary: in this tutorial, you will learn about various C float types including float, double and long double.
Introduction to C float types
Floating-point numbers are numbers that have a decimal point. For example, 3.14 is a floating-point number. C has two floating-point types:
- float: single-precision floating-point numbers
- double: double-precision floating-point numbers.
The following example uses the float and double keyword to define floating-point number variables:
- First, define three floating-point numbers x, y, and z.
- Second, add three numbers up and display the result.
The sum of 0.1, 0.1, and 0.1 is not 0.3 but 0.30000001192092896000. This is is due to the precision of the floating-point numbers.
What is precision?
If you consider the fraction 5/3, this number can be represented in decimal as 1.666666666. with infinite 6.
Since computers use a fixed number of bits, it cannot store an infinite number. Instead, computers store these numbers with precisions.
The precision is expressed as a number of significant digits. In other words, precision is defined as how many digits that a number can represent without data loss.
For example, the float type with 4 bytes = 4 x 8 bits = 32 bits, is for numbers with single precision. It means that a float gives 1 sign bit, 8 bits of exponent, and 23 bits of significand.
The double type is for a number with the double-precision that gives 1 sign bit, 11 bits of exponent, and 52 bits of significand. (8 bytes x 8 bits = 64 bits = 1 bits + 52 bits + 11 bits).
Short and long qualifiers
Like integers, you can apply the short and long qualifier to control the size of the floating-point type. The following table shows the floating-point types in C.
| Type | Size | Ranges | Smallest Positive Value | Precision |
|---|---|---|---|---|
| float | 4 bytes | ±3.4E+38 | 1.2E-38 | 6 digits |
| double | 8 bytes | ±1.7E+308 | 2.3E-308 | 15 digits |
| long double | 10 bytes | ±1.1E+4932 | 3.4E-4932 | 19 digits |
It is important to note that this is only the minimal requirement for storage size defined by C.
Float ranges and precision
To find the value ranges of the floating-point number, you can use the float.h header file. This header file defines macros such as FLT_MIN , FLT_MAX and FLT_DIG that store the float value ranges and precision of the float types.
The float.h also defines macros for double and long double with the prefixes DBL_ and LDBL_ .
The following program illustrates the storage size and precision of floating-point numbers in your system.
Типы данных

Типы данных имеют особенное значение в C#, поскольку это строго типизированный язык. Это означает, что все операции подвергаются строгому контролю со стороны компилятора на соответствие типов, причем недопустимые операции не компилируются. Следовательно, строгий контроль типов позволяет исключить ошибки и повысить надежность программ. Для обеспечения контроля типов все переменные, выражения и значения должны принадлежать к определенному типу. Такого понятия, как «бестиповая» переменная, в данном языке программирования вообще не существует. Более того, тип значения определяет те операции, которые разрешается выполнять над ним. Операция, разрешенная для одного типа данных, может оказаться недопустимой для другого.
В C# имеются две общие категории встроенных типов данных: типы значений и ссылочные типы. Они отличаются по содержимому переменной. Концептуально разница между ними состоит в том, что тип значения (value type) хранит данные непосредственно, в то время как ссылочный тип (reference type) хранит ссылку на значение.
Эти типы сохраняются в разных местах памяти: типы значений сохраняются в области, известной как стек, а ссылочные типы — в области, называемой управляемой кучей.

Давайте разберем типы значений.
Целочисленные типы
В C# определены девять целочисленных типов: char, byte, sbyte, short, ushort, int, uint, long и ulong. Но тип char применяется, главным образом, для представления символов и поэтому рассматривается отдельно. Остальные восемь целочисленных типов предназначены для числовых расчетов. Ниже представлены их диапазон представления чисел и разрядность в битах:
| Тип | Тип CTS | Разрядность в битах | Диапазон |
|---|---|---|---|
| byte | System.Byte | 8 | 0:255 |
| sbyte | System.SByte | 8 | -128:127 |
| short | System.Int16 | 16 | -32768 : 32767 |
| ushort | System.UInt16 | 16 | 0 : 65535 |
| int | System.Int32 | 32 | -2147483648 : 2147483647 |
| uint | System.UInt32 | 32 | 0 : 4294967295 |
| long | System.Int64 | 64 | -9223372036854775808 : 9223372036854775807 |
| ulong | System.UInt64 | 64 | 0 : 18446744073709551615 |
Как следует из приведенной выше таблицы, в C# определены оба варианта различных целочисленных типов: со знаком и без знака. Целочисленные типы со знаком отличаются от аналогичных типов без знака способом интерпретации старшего разряда целого числа. Так, если в программе указано целочисленное значение со знаком, то компилятор C# сгенерирует код, в котором старший разряд целого числа используется в качестве флага знака. Число считается положительным, если флаг знака равен 0, и отрицательным, если он равен 1.
Отрицательные числа практически всегда представляются методом дополнения до двух, в соответствии с которым все двоичные разряды отрицательного числа сначала инвертируются, а затем к этому числу добавляется 1.
Вероятно, самым распространенным в программировании целочисленным типом является тип int. Переменные типа int нередко используются для управления циклами, индексирования массивов и математических расчетов общего назначения. Когда же требуется целочисленное значение с большим диапазоном представления чисел, чем у типа int, то для этой цели имеется целый ряд других целочисленных типов.
Так, если значение нужно сохранить без знака, то для него можно выбрать тип uint, для больших значений со знаком — тип long, а для больших значений без знака — тип ulong. В качестве примера ниже приведена программа, вычисляющая расстояние от Земли до Солнца в сантиметрах. Для хранения столь большого значения в ней используется переменная типа long:
Всем целочисленным переменным значения могут присваиваться в десятичной или шестнадцатеричной системе обозначений. В последнем случае требуется префикс 0x:
Если возникает какая-то неопределенность относительно того, имеет ли целое значение тип int, uint, long или ulong, то по умолчанию принимается int. Чтобы явно специфицировать, какой другой целочисленный тип должно иметь значение, к числу можно добавлять следующие символы:
U и L можно также указывать в нижнем регистре, хотя строчную L легко зрительно спутать с цифрой 1 (единица).
Типы с плавающей точкой
Типы с плавающей точкой позволяют представлять числа с дробной частью. В C# имеются две разновидности типов данных с плавающей точкой: float и double. Они представляют числовые значения с одинарной и двойной точностью соответственно. Так, разрядность типа float составляет 32 бита, что приближенно соответствует диапазону представления чисел от 5E-45 до 3,4E+38. А разрядность типа double составляет 64 бита, что приближенно соответствует диапазону представления чисел от 5E-324 до 1,7Е+308.
Тип данных float предназначен для меньших значений с плавающей точкой, для которых требуется меньшая точность. Тип данных double больше, чем float, и предлагает более высокую степень точности (15 разрядов).
Если нецелочисленное значение жестко кодируется в исходном тексте (например, 12.3), то обычно компилятор предполагает, что подразумевается значение типа double. Если значение необходимо специфицировать как float, потребуется добавить к нему символ F (или f):
Десятичный тип данных
Для представления чисел с плавающей точкой высокой точности предусмотрен также десятичный тип decimal, который предназначен для применения в финансовых расчетах. Этот тип имеет разрядность 128 бит для представления числовых значений в пределах от 1Е-28 до 7,9Е+28. Вам, вероятно, известно, что для обычных арифметических вычислений с плавающей точкой характерны ошибки округления десятичных значений. Эти ошибки исключаются при использовании типа decimal, который позволяет представить числа с точностью до 28 (а иногда и 29) десятичных разрядов. Благодаря тому что этот тип данных способен представлять десятичные значения без ошибок округления, он особенно удобен для расчетов, связанных с финансами:
Результатом работы данной программы будет:

Символы
В C# символы представлены не 8-разрядным кодом, как во многих других языках программирования, например С++, а 16-разрядным кодом, который называется юникодом (Unicode). В юникоде набор символов представлен настолько широко, что он охватывает символы практически из всех естественных языков на свете. Если для многих естественных языков, в том числе английского, французского и немецкого, характерны относительно небольшие алфавиты, то в ряде других языков, например китайском, употребляются довольно обширные наборы символов, которые нельзя представить 8-разрядным кодом. Для преодоления этого ограничения в C# определен тип char, представляющий 16-разрядные значения без знака в пределах от 0 до 65 535. При этом стандартный набор символов в 8-разрядном коде ASCII является подмножеством юникода в пределах от 0 до 127. Следовательно, символы в коде ASCII по-прежнему остаются действительными в C#.
Для того чтобы присвоить значение символьной переменной, достаточно заключить это значение (т.е. символ) в одинарные кавычки:
Несмотря на то что тип char определен в C# как целочисленный, его не следует путать со всеми остальными целочисленными типами. Дело в том, что в C# отсутствует автоматическое преобразование символьных значений в целочисленные и обратно. Например, следующий фрагмент кода содержит ошибку:
Наравне с представлением char как символьных литералов, их можно представлять как 4-разрядные шестнадцатеричные значения Unicode (например, ‘\u0041’), целочисленные значения с приведением (например, (char) 65) или же шестнадцатеричные значения (например, ‘\x0041’). Кроме того, они могут быть представлены в виде управляющих последовательностей.
Логический тип данных
Тип bool представляет два логических значения: «истина» и «ложь». Эти логические значения обозначаются в C# зарезервированными словами true и false соответственно. Следовательно, переменная или выражение типа bool будет принимать одно из этих логических значений. Кроме того, в C# не определено взаимное преобразование логических и целых значений. Например, 1 не преобразуется в значение true, а 0 — в значение false.