Подробное описание типов данных в языке СИ
Подробное описание типов данных в языке СИ
тип | Символьный тип | Целочисленный тип | Вещественный тип одинарной точности | Вещественный тип двойной точности |
описание | char | int | Float | double |
размер | 1 байт (8 бит) | 4 байта (32 бита) | 4 байта (32 бита) 23 бита – мантисса; 8 бит – порядок; 1 бит – знак. | 8 байт (64 бита) 52 бита – мантисса; 11 бит – порядок; 1 бит – знак. |
диапазон значений | -128 ... 127 | 2147483648 ... 2147483647 | ±3.4Е±38 Точность до 7 знаков после запятой | ±1.7Е±308 Точность до 17 знаков после запятой |
КОНСТАНТЫ В СИ.
В языке СИ присутствует три вида констант: 1. целочисленные, 2. вещественные, 3. символьные. Целочисленные константы 1. Десятичная константа указывается десятичным числом в обычной форме. 2. Восьмеричная константа указывается числом, начинающимся с цифры ноль и содержащим цифры 0...7. 3. Шестнадцатеричная константа указывается целым числом с префиксом 0x или 0X, содержащим цифры 0...9 и буквы латинского алфавита a...f, A...F. Вещественные константы записываются в десятичной или шестнадцатеричной системе исчисления. Позиция запятой указывается точкой, экспонента указывается после латинской буквы e (или E). Символьная константа — это целое число в форме одного символа в кавычках, например ' х'. Символьным константам предшествует символ \, это так называемое "экранирование". Такие последовательности содержат два символа, но обозначают только один. В языке СИ присутствуют специальные символы: ‘\’’ – одинарная кавычка, ‘\”’ – двойная кавычка, ‘\\’ – обратный слеш, ‘\?’ – знак вопроса, ‘\a’ – звуковой сигнал, ‘\b’ – удаление символа, ‘\f’ – прокрутка страницы, ‘\n’ – перевод строки, ‘\r’ – возврат каретки в начало строки, ‘\t’ – горизонтальная табуляция, ‘\v’ – вертикальная табуляция. Константное выражение— это выражение, содержащее только константы. Такие выражения могут вычисляться в ходе компиляции, а не выполнения программы, и соответственно употребляться в любом месте, где допускается применение одной константы:
#define MAXLINE 1000
char line[MAXLINE+1];
Строковая константа, строковый литерал, или просто литерал — это последовательность из нескольких (в частном случае ни одного) символов, заключенных в двойные кавычки, например: "I am a string".
В языке СИ можно также создавать переменные, имеющие константное значение (их значение нельзя изменить). Объявление таких «переменных» имеет следующий синтаксис: const тип имя1=значение1[,имя2=значение2[,...]]; Примеры: const unsigned int x=80, y=25; const double pi=3.1415;
ОБЪЯВЛЕНИЯ.
Все переменные необходимо объявить до их использования, хотя некоторые объявления могут быть сделаны неявно — по контексту. В объявлении указываются тип и список из одной или нескольких переменных этого типа:
int lower, upper, step;
char с, line[1000];
Переменные можно разделять по строкам произвольным образом, например:
float a; float b;Переменные можно инициализировать прямо в объявлениях. Если после имени поставить знак равенства и выражение, то значение этого выражения будет присвоено переменной при ее создании:
Выясним теперь, где в тексте программы определяются данные. В языке возможны глобальные и локальные объекты. Первые определяются вне функций и, следовательно, доступны для любой из них. Локальные объекты по отношению к функциям являются внутренними. Они начинают существовать, при входе в функцию и уничтожаются после выхода из нее. Ниже показана структура программы на Си и возможные места в программе, где определяются глобальные и локальные объекты.
int a; /* Определение глобальной переменной */ int function (int b, char c); /* Объявление функции (т.е. описание ее заголовка)*/ void main (void){ //Тело программы int d, e; //Определение локальных переменных float f; //Определение локальной переменной}int function (int b, char c) /* Определение функции и формальных параметров (по существу -локальных переменных) b и c */{ //Тело функции char g; //Определение локальной переменной ...}5. АРИФМЕТИЧЕСКИЕ ОПЕРАЦИИ.
Арифметические операции задаются следующими символами (табл. 2): +, -, *, /, %. Последнюю из них нельзя применять к переменным вещественного типа. Например:
a = b + c; x = y - z; r = t * v; s = k / l; p = q % w;Основными арифметическими операциями являются: сложение (‘+’), вычитание (‘-‘), умножение (‘*’) и деление (‘/’). Порядок выполнения операций в выражении соответствует их приоритету. Операции с одинаковым приоритетом в выражении выполняются слева направо.
Операция деления (‘/’) выполняется согласно типу ее операндов. Если оба операнда являются целыми числами, то деление будет целочисленным. Если один из операндов является вещественным, то и результат будет вещественным. Например, пусть переменная x имеет целочисленный тип, а y действительный тип. Следующая таблица демонстрирует результаты деления для различных операндов:
операция | результат |
x = 7 / 3; | x = 2 |
y = 7 / 3; | y = 2.000000 |
y = 7.0 / 3; | y = 2.333333 |
y = (double)7 / 3; | y = 2.333333 |
Рассмотрим второй пример. При выполнении операции присваивания значения выражения переменной, сначала вычисляется значение выражения, а потом оно присваивается переменной. Поскольку операнды во втором примере являются целыми, то результатом деления 7 / 3 будет 2. Потом целочисленное значение 2 преобразовывается в действительное значение 2.000000 и присваивается действительной переменной y.
В четвертом примере перед выполнением операции деления происходит преобразование типа делимого из целого в вещественный. Поэтому деление будет производиться без потери точности.
Пример. Найти среднее арифметическое двух целых чисел a и b.
Результатом вычисления выражения (a + b) / 2 может быть действительное число. Поэтому деление должно выполняться с сохранением точности. А для этого один из операндов необходимо преобразовать в действительный тип. Например, результат можно вычислить так: res = (a + b) / 2.0. Программа имеет вид:
#include <stdio.h>
int a,b;
double res;
void main(void)
{
scanf("%d %d",&a,&b);
res = (a + b) / 2.0;
printf("%lf\n",res);
}
Операция вычисления остатка в Си обозначается символом ‘%’. При этом остаток при делении отрицательного числа на положительное является отрицательным (хотя математически остаток при делении на число n должен лежать в промежутке от 0 до n – 1 включительно).
Операция | результат |
x = 6 % 3 | x = 0 |
x = 8 % 3 | x = 2 |
x = -6 % 3 | x = 0 |
x = -8 % 3 | x = -2 |
ПРЕОБРАЗОВАНИЕ ТИПОВ ДАННЫХ В СИ.
В СИ, как и в других языках, выполняются автоматические и явные преобразования типов данных. Преобразования выполняются автоматически, если в выражении присутствуют данные разных типов. Рассмотрение таких преобразований предоставляется для самостоятельной проработки. Для явного преобразования типов используется унарный оператор, называемый приведением. Конструкция вида
(имя-типа) выражение
приводит результат выражения к указанному в скобках типу данных.
Например, в СИ аргумент библиотечной функции sqrt (извлечение квадратного корня) должен иметь аргумент типа double. Поэтому, если n есть целое число, то при извлечении квадратного корня следует написать
sqrt((double) n).
При этом вырабатывается значение n типа double. Сама же переменная n тип не изменяет.
Замечание. Функции преобразования строка в int, строка в double и ряд других функций преобразования типа данных описаны в файле stdlib.h.
В C++ различают явное и неявное преобразование типов данных. Неявное преобразование типов данных выполняет компилятор С++, ну а явное преобразование данных выполняет сам программист. О преобразовании типов данных скажу следующее: «Результат любого вычисления будет преобразовываться к наиболее точному типу данных, из тех типов данных, которые участвуют в вычислении». Для наглядного примера представлю таблицу с преобразованиями типов данных. В таблице рассмотрим операцию деления. В качестве целочисленного типа данных возьмем int, ну и вещественный тип данных у нас будет float.
Таблица 1 — Явное и неявное преобразование типов данных в С++ | |||
x | y | Результат деления | Пример |
делимое | делитель | частное | x = 15 y = 2 |
int | int | int | 15/2=7 |
int | float | float | 15/2=7.5 |
float | int | float | 15/2=7.5 |
Из таблицы видно, что меняя переменные различных типов данных местами, результат остается тот же (в нашем случае это делимое и делитель). О неявном преобразовании типов данных все. Что же касается явного преобразования, то оно необходимо для того чтобы выполнять некоторые манипуляции, тем самым меняя результат вычисления. Самый простой способ явного преобразования типов данных, пример: допустим нам необходимо разделить такие числа 15 и 2, делим! 15/2=7. Результат тот же, что и в таблице. Но если сделать незначительные преобразования, например: 15.0/2=7.5 при таком делении число 15 является вещественным, значит и результат будет вещественный. Само число 15 с точки зрения математики не изменилось, ведь 15=15.0. Этот же прием можно было применить к двойке, результат был бы тем же, а можно было сразу к двум числам, но зачем ,если хватает одного из двух.
Еще один способ явного преобразования типов данных:
float(15) / 2 // результат равен 7.5, число 15 преобразуется в вещественный тип данных float. double(15) / 2 // результат равен 7.5 – тоже самое!!! |
УСЛОВНЫЕ ВЫРАЖЕНИЯ.
(выражение-для-проверки) ? если тру выполнить это : если фолс выполнить это;
(7%2 !=0) ? print (“четное число”) : print (“нечетное число”);
Подробное описание типов данных в языке СИ
тип | Символьный тип | Целочисленный тип | Вещественный тип одинарной точности | Вещественный тип двойной точности |
описание | char | int | Float | double |
размер | 1 байт (8 бит) | 4 байта (32 бита) | 4 байта (32 бита) 23 бита – мантисса; 8 бит – порядок; 1 бит – знак. | 8 байт (64 бита) 52 бита – мантисса; 11 бит – порядок; 1 бит – знак. |
диапазон значений | -128 ... 127 | 2147483648 ... 2147483647 | ±3.4Е±38 Точность до 7 знаков после запятой | ±1.7Е±308 Точность до 17 знаков после запятой |
КОНСТАНТЫ В СИ.
В языке СИ присутствует три вида констант: 1. целочисленные, 2. вещественные, 3. символьные. Целочисленные константы 1. Десятичная константа указывается десятичным числом в обычной форме. 2. Восьмеричная константа указывается числом, начинающимся с цифры ноль и содержащим цифры 0...7. 3. Шестнадцатеричная константа указывается целым числом с префиксом 0x или 0X, содержащим цифры 0...9 и буквы латинского алфавита a...f, A...F. Вещественные константы записываются в десятичной или шестнадцатеричной системе исчисления. Позиция запятой указывается точкой, экспонента указывается после латинской буквы e (или E). Символьная константа — это целое число в форме одного символа в кавычках, например ' х'. Символьным константам предшествует символ \, это так называемое "экранирование". Такие последовательности содержат два символа, но обозначают только один. В языке СИ присутствуют специальные символы: ‘\’’ – одинарная кавычка, ‘\”’ – двойная кавычка, ‘\\’ – обратный слеш, ‘\?’ – знак вопроса, ‘\a’ – звуковой сигнал, ‘\b’ – удаление символа, ‘\f’ – прокрутка страницы, ‘\n’ – перевод строки, ‘\r’ – возврат каретки в начало строки, ‘\t’ – горизонтальная табуляция, ‘\v’ – вертикальная табуляция. Константное выражение— это выражение, содержащее только константы. Такие выражения могут вычисляться в ходе компиляции, а не выполнения программы, и соответственно употребляться в любом месте, где допускается применение одной константы:
#define MAXLINE 1000
char line[MAXLINE+1];
Строковая константа, строковый литерал, или просто литерал — это последовательность из нескольких (в частном случае ни одного) символов, заключенных в двойные кавычки, например: "I am a string".
В языке СИ можно также создавать переменные, имеющие константное значение (их значение нельзя изменить). Объявление таких «переменных» имеет следующий синтаксис: const тип имя1=значение1[,имя2=значение2[,...]]; Примеры: const unsigned int x=80, y=25; const double pi=3.1415;
ОБЪЯВЛЕНИЯ.
Все переменные необходимо объявить до их использования, хотя некоторые объявления могут быть сделаны неявно — по контексту. В объявлении указываются тип и список из одной или нескольких переменных этого типа:
int lower, upper, step;
char с, line[1000];
Переменные можно разделять по строкам произвольным образом, например:
float a; float b;Переменные можно инициализировать прямо в объявлениях. Если после имени поставить знак равенства и выражение, то значение этого выражения будет присвоено переменной при ее создании:
int a = 25, h = 6; char g = 'Q', k = 'm'; float r = 1.89; long double n = r*123;Выясним теперь, где в тексте программы определяются данные. В языке возможны глобальные и локальные объекты. Первые определяются вне функций и, следовательно, доступны для любой из них. Локальные объекты по отношению к функциям являются внутренними. Они начинают существовать, при входе в функцию и уничтожаются после выхода из нее. Ниже показана структура программы на Си и возможные места в программе, где определяются глобальные и локальные объекты.
int a; /* Определение глобальной переменной */ int function (int b, char c); /* Объявление функции (т.е. описание ее заголовка)*/ void main (void){ //Тело программы int d, e; //Определение локальных переменных float f; //Определение локальной переменной}int function (int b, char c) /* Определение функции и формальных параметров (по существу -локальных переменных) b и c */{ //Тело функции char g; //Определение локальной переменной ...}5. АРИФМЕТИЧЕСКИЕ ОПЕРАЦИИ.
Арифметические операции задаются следующими символами (табл. 2): +, -, *, /, %. Последнюю из них нельзя применять к переменным вещественного типа. Например:
a = b + c; x = y - z; r = t * v; s = k / l; p = q % w;Основными арифметическими операциями являются: сложение (‘+’), вычитание (‘-‘), умножение (‘*’) и деление (‘/’). Порядок выполнения операций в выражении соответствует их приоритету. Операции с одинаковым приоритетом в выражении выполняются слева направо.
Операция деления (‘/’) выполняется согласно типу ее операндов. Если оба операнда являются целыми числами, то деление будет целочисленным. Если один из операндов является вещественным, то и результат будет вещественным. Например, пусть переменная x имеет целочисленный тип, а y действительный тип. Следующая таблица демонстрирует результаты деления для различных операндов:
операция | результат |
x = 7 / 3; | x = 2 |
y = 7 / 3; | y = 2.000000 |
y = 7.0 / 3; | y = 2.333333 |
y = (double)7 / 3; | y = 2.333333 |
Рассмотрим второй пример. При выполнении операции присваивания значения выражения переменной, сначала вычисляется значение выражения, а потом оно присваивается переменной. Поскольку операнды во втором примере являются целыми, то результатом деления 7 / 3 будет 2. Потом целочисленное значение 2 преобразовывается в действительное значение 2.000000 и присваивается действительной переменной y.
В четвертом примере перед выполнением операции деления происходит преобразование типа делимого из целого в вещественный. Поэтому деление будет производиться без потери точности.
Пример. Найти среднее арифметическое двух целых чисел a и b.
Результатом вычисления выражения (a + b) / 2 может быть действительное число. Поэтому деление должно выполняться с сохранением точности. А для этого один из операндов необходимо преобразовать в действительный тип. Например, результат можно вычислить так: res = (a + b) / 2.0. Программа имеет вид:
#include <stdio.h>
int a,b;
double res;
void main(void)
{
scanf("%d %d",&a,&b);
res = (a + b) / 2.0;
printf("%lf\n",res);
}
Операция вычисления остатка в Си обозначается символом ‘%’. При этом остаток при делении отрицательного числа на положительное является отрицательным (хотя математически остаток при делении на число n должен лежать в промежутке от 0 до n – 1 включительно).
Операция | результат |
x = 6 % 3 | x = 0 |
x = 8 % 3 | x = 2 |
x = -6 % 3 | x = 0 |
x = -8 % 3 | x = -2 |