Лекции / Тельминов (мб) / LECS2
.DOCЛекция № 2.
Простые ( собственные ,предопределенные )типы данных.
Эти типы имеют набор значений и представление, привязанные к низкоуровневой архитектуре ЭВМ, на которой работает компилятор.
Тип характеризует:
-
Форму представления;
-
Диапазон значений;
-
Допустимые операции, включая преобразование типа.
Размеры в
Типы данных байтах Диапазон значений Пример
bool 1 false, true
char 1 -128...127 ’A’ ’!’
signed char 1 - 128...127 20
unsigned char 1 0...255 200
int 2 - 32768...32767 200
unsigned int 2 0...65535 0xffff
short int 2 -32768...32767 100
unsigned short int 2 0...65535 40000
long int 4 -2147483648...
...2147486347 0xfffff
unsigned long int 4 0...4294967295 123456
float 4 3.4E-38...3.4E+38 2.35
-3.4E-38...-3.4E+38 1.3E+10
double 8 1.7E-308...1.7E+308 12.354
-1.7E-308...-1.7E+308 -78.35444
-2.5E+100
long double 10 3.4E-4932...1.1E+4932 8.5E-3000
-1.1E-4932...-3.4E+4932 8.5E+3000
Для определения количества байт используется оператор sizeof (для типа или объекта) .
cout << sizeof (int) << ‘< =’ << sizeof (long) <<endl
Диапазон целых значений определен в стандартном заголовочном файле limits.h
Например:
# define CHAR_BIT 8 //бит на символ
# define INT_MAX 2147483647 //int max
# define UNIT_MAX 429496729U //unsigned int max
Диапазон значений с плавающей точкой определен в стандартном заголовочном файле float.h.
Например, [2]
# define FLT_MIN ((float) 1.17549435e - 38 //float min
# define FLT_MAX((float) 3.40282347e +38 // float max
# define DBL_MAX 1.7976931348623157e // double max
В новых системах файл limits содержит шаблон numeric-limits < type >:: max( ) //
//максимальное значение для < типа >
Объявление и инициализация
Объявление переменной связывает имя переменной с типом.
//Вычисление площади круга
extern const double P1; // объявлено, не определено
int main ( )
{ double radius = 5.5; // объявлено, определено
// инициализировано
double area ; // объявлено, определено
// не инициализировано
cout <<’Площадь круга :’<< ( PI * radius * radius ) ;
Под radius и area память выделяется в системном стеке.
Объявление переменной является и определением ,если обеспечивается выделение памяти под переменную.
Определение может быть с инициализатором .
Для простых переменных это выглядит так
тип идентификатор = выражение
Например:
{ int i = 5; //инициализируется значением 5
char c1,c2 = ‘B’; //c1 не инициализировано
double x = 0.777, y = x + i;
cout << x <<’\ t’ << y; //вывод 0.777 5.777
cout <<c2; //вывод ‘B’
cout <<c1; //зависит от системы
...
}
Инициализировать можно при помощи произвольного выражения, при условии, что все переменные и функции определены.
Объявления могут встречаться в любом месте блока.
Традиционные преобразования
Любое арифметическое выражение х + y имеет тип и значение, если обе переменные одного типа, то и результат будет того же типа, если хватает места под значение
short + short int , если результат больше short.
Автоматическое преобразование выражения [2].
-
Все bool,char,short или enum преобразуются до int. Целые типы, которые не могут быть представлены как int , повышаются до unsigned.
-
Если после первого шага выражение остается смешанным, то операнд более низкого типа повышается до более высокого типа и значение выражения получает этот тип.
int < unsigned < long < unsigned long < float < double < long double
Может случиться что несколько unsigned приведет сразу к unsigned long.
Примеры:
char c; long lg; double d;
short s; float f; unsigned u; int i;
Выражение Тип
c - s/i int
u * 3.0 - i double
c + i int
c + 1.0 double
u*3 - i unsigned
f*3 - i float
3*s*lg long
d + s double
d = i ; // double
i = d; // зависит от реализации
// может быть отброшена
// дробная часть d
Явное преобразование типа, называемое приведением. Пусть i -целое, тогда
static _cast < double >( i )
Выполнит приведение значения i так , что выражение будет иметь тип double.
Еще пример:
х = static_cast < double >( static_cast < int >( y ) + 1)
Старая форма записи
( тип ) выражение тип ( выражение )
Например:
y = i / double ( 7 ) //разделит с двойной точностью
ptr = ( char *) ( i + 88 ); // целое к значению указателя.
Пример программы из [2]
//Перевод миль в километры
# include < iostream.h >
const double m_to_k = 1.609; //коэффициент преобразования
inline double mi_to_km (int miles)
{
return ( miles * m_to_k ) ;
}
int main ( )
{
int miles;
double kilometers;
do {cout <<’’\ n Введите расстояние в милях :’’);
cin >> miles;
kilometers = mi_to_km (miles)
cout <<’’\ n Это примерно’’
<< static_cast < int > ( kilometers )
<< ’’km ’’ <<endl;
} while ( miles >0 )
}
Выражения и операторы
Перечислим операторы в порядке понижения приоритетов операций.
Операция Название Пример Порядок
: : Глобальная об- : : name слева направо
ласть видимости
: : Область види- class name :: member
мости класса
. Выбор элемента
структуры или time.hour слева направо
класса
Выбор элемента pointer member
структуры или
класса
[ ] Доступ по индексу
массива pointer [expr]
( ) Вызов функции,конс- expr(expr_lst)
труирование значения type(expr_lst)
+ + Постфиксный инкре- lvalue ++
мент (j = i ++;равнозначно j = i ; i = i + 1);
-- Постфиксный декре- lvalue --
мент (j = i --;равнозначно j = i ; i = i - 1);
typeid ( ) идентификация типа typeid ( type )
идентификация типа
во время выполнения typeid (expr)
преобразование с про-
веркой
во время выполнения dynamic_cast
< type>(expr)