Язык Си в примерах/Учимся складывать: различия между версиями

Содержимое удалено Содержимое добавлено
Выделены три раздела; дополнения и удаления (NB: материал следует выборочно вернуть); ссылки на стандарт.
→‎Числовые типы: Новый раздел.
Строка 68:
 
<small>Здесь следует отметить, что в случае <code>scanf</code> совершенно идентично будут действовать указатели преобразований <code>%lf</code> и <code>%le</code>. Напротив, в случае <code>printf</code> не будет разницы между <code>%lg</code> и <code>%g</code>. Причины такого поведения мы также пока оставим без внимания.</small>
 
== Числовые типы ==
 
Список числовых типов, определяемых стандартом, следующий (некоторые из этих типов могут иметь более одного стандартного названия; приведены кратчайшие):<ref name="types" >[http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf#page=57 WG14 N1570 Committee Draft — April 12, 2011] 6.2.5 ''Types''</ref><ref name="limits" >[http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf#page=523 WG14 N1570 Committee Draft — April 12, 2011] Annex E (informative) ''Implementation limits''</ref>
* [[w:Целое число|целочисленные]]:
** <code>_Bool</code> — логическая величина (0 или 1), не менее одного бита;
** <code>signed char</code> — байт, не менее 8 бит;
** <code>short</code> — короткое целое, не менее 16 бит;
** <code>int</code> — целое, не менее 16 бит;
** <code>long</code> — длинное целое, не менее 32 бит;
** <code>long long</code> — длинное длинное целое, не менее 64 бит;
* [[w:Число с плавающей запятой|с плавающей запятой]]:
** <code>float</code> — диапазон: не хуже 10⁻³⁷ … 10⁺³⁷, [[w:Число с плавающей запятой#Машинная эпсилон|''ε''<sub>маш</sub>]] < 10⁻⁵;
** <code>double</code>, <code>long double</code> — диапазон: не хуже 10⁻³⁷ … 10⁺³⁷, ''ε''<sub>маш</sub> < 10⁻9;
* [[w:Комплексное число|комплексные]]: <code>float _Complex</code>, <code>double _Complex</code>, <code>long double _Complex</code> — диапазон и ''ε''<sub>маш</sub> действительной и мнимой частей совпадают с таковыми для соответствующих чисел с плавающей запятой.
 
В случае, если используемая система реализует стандарт [[w:IEEE 754-2008|IEC 60559]] на числа с плавающей запятой, типы с плавающей запятой имеют следующие параметры:
* <code>float</code> — соответствует представлению «[[w:Число одинарной точности|одинарной точности]]» IEC 60559; диапазон: 1,18 × 10⁻³⁸ … 3,40 × 10⁺³⁸, ''ε''<sub>маш</sub> = 1.19 × 10⁻⁷;
* <code>double</code> — «[[w:Число двойной точности|двойная точность]]» IEC 60559; диапазон: 2,225 × 10⁻³⁰⁸ … 1.80 × 10⁺³⁰⁸, ''ε''<sub>маш</sub> = 2.22 × 10⁻¹⁶;
* <code>long double</code> — «[[w:Число четверной точности|четверная точность]]» IEC 60559; диапазон: 3,36 × 10⁻⁴⁹³² … 1,19 × 10⁺⁴⁹³², ''ε''<sub>маш</sub> = 1.08 × 10⁻¹⁹.
 
Кроме того, из целочисленных типов могут быть образованы ''беззнаковые'' («неотрицательные») добавлением <code>unsigned</code> перед именем типа. (Исключение: <code>signed char</code> переходит в <code>unsigned char</code>.)
 
При преобразовании между текстовым (строковым) представлением и этими типами, используются, в частности, следующие указатели преобразований, состоящие из знака <code>%</code>, ''указателя разрядности'', и ''указателя представления''.
; Указатели представлений
:; Целые числа
::* <code>d</code>, <code>i</code> — десятичная запись со знаком (42);
::* <code>u</code> — десятичная запись без знака (42);
::* <code>o</code> — восьмеричная запись (52);
::* <code>x</code>, <code>X</code> — шестнадцатеричная запись (2a, 2A).
:; Числа с плавающей запятой
::* <code>f</code> — десятичная запись (1000000.000000);
::* <code>e</code> — десятичная [[w:Экспоненциальная запись#Компьютерный способ экспоненциальной записи|E-запись]] (1.000000e+06, 1.000000E+06);
::* <code>g</code> — «автоматический» выбор между <code>e</code> и <code>f</code>;
::* <code>a</code>, <code>A</code> — шестнадцатеричная запись (0xf.4240p4, 0XF.4240P4).
; Указатели разрядности
:; Целые числа
::* <code>hh</code> — для типов <code>signed char</code> и <code>unsigned char</code>;
::* <code>h</code> — для типов <code>short</code> и <code>unsigned short</code>;
::* (пустая строка) — для типов <code>int</code> и <code>unsigned int</code>
::* <code>l</code> — для типов <code>long</code> и <code>unsigned long</code>;
::* <code>ll</code> — для типов <code>long long</code> и <code>unsigned long</code>.
:; Числа с плавающей запятой
::* (пустая строка) — для типа <code>float</code>;
::* <code>l</code> — для типа <code>double</code>;
::* <code>L</code> — для типа <code>long double</code>.
; Примеры
:* <code>%hx</code> — значение типа <code>unsigned short</code> в шестнадцатеричной записи;
:* <code>%le</code> — значение типа <code>double</code> в десятичной E-записи.
 
Отметим, что в контексте функций ряда <code>printf</code>, указатель разрядности <code>l</code> не играет никакой роли, если применяется к числу с плавающей запятой. Так, вызовы <code>printf ("%lg", a);</code> и <code>printf ("%g", a);</code> совершенно равнозначны. При передаче таким функциям значений типов <code>signed char</code>, <code>short</code>, и соответствующих беззнаковых, — указатели разрядности <code>hh</code> и <code>h</code> также могут быть опущены.
 
== Вариант «полный» ==