Студопедия — Signed, unsigned, long, short
Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

Signed, unsigned, long, short






Базовый тип int может быть модифицирован каждым из перечисленных спецификаторов, тип char – с помощью unsigned и signed, тип double – с помощью long [4].


 

В табл. 2.1 приведены допустимые комбинации типов данных языка С с их минимальным диапазоном значений и типичным размером [4].

Таблица 2.1
Типы данных языка С
Тип данных Типичный размер в битах Минимально допустимый диапазон значений
char 8 (или 1 байт) от –127 до 127
unsigned char   от 0 до 255
signed char   от –127 до 127
int 16 или 32 от –32 767 до 32 767
unsigned int 16 или 32 от 0 до 65 535
signed int 16 или 32 от –32 767 до 32 767
short int   от –32 767 до 32 767
unsigned short int   от 0 до 65 535
signed short int   от –32 767 до 32 767
long int   от –2 147 483 647 до 2 147 483 647
long long int   от –(263 – 1) до (263 – 1) для С99
signed long int   от –2 147 483 647 до 2 147 483 647
unsigned long int   от 0 до 4 294 967 295
unsigned long long int   от 0 до (264 – 1) для С99
float   от 1Е – 37 до 1Е + 37 (с точностью не менее 6 значащих десятичных цифр)
double   от 1Е – 37 до 1Е + 37 (с точностью не менее 10 значащих десятичных цифр)
long double     от 1Е – 37 до 1Е + 37 (с точностью не менее 10 значащих десятичных цифр)

Для базового типа int возможны следующие записи с модификатором:

- signed или signed int;

- unsigned или unsigned int;

- long или long int;

- short или short int.

Для данных вещественного типа максимальные значения абсолютных величин представлены в табл. 2.2 [4].

Таблица 2.2
Вещественные типы данных языка С
Тип данных Типичный размер в битах Диапазон абсолютных величин
float double long double   от 3.4Е – 38 до 3.4Е + 37 от 1.7Е – 308 до 1.7Е +308 от 3.4Е – 4932 до 1.1Е + 4932

В языке С предусматриваются преобразование типов в выражениях и приведение типов. Если в выражении смешаны различные типы литералов и переменных, то компилятор преобразует их в один. Во-первых, все char и short int значения автоматически преобразуются (с расширением «типоразмера») в тип int. Этот процесс называется целочисленным расширением (integral promotion). Во-вторых, все операнды преобразуются (также с расширением «типоразмера») в тип самого большого операнда. Этот процесс называется расширением типа (type promotion), выполняется он пооперационно. Например, если один операнд имеет тип int, а другой – long int, то тип int расширяется в тип long int. Или если хотя бы один из операндов имеет тип double, то любой другой операнд приводится к типу double. Это означает, что такие преобразования, как char в double, вполне допустимы (если предусматривать, к чему это приведет). После преобразования оба операнда будут иметь один и тот же тип, а результат операции – тип, совпадающий с типом операндов [4]. Приведем последовательность преобразования типов в выражениях по старшинству.

Если операнд имеет тип long double,

то второй операнд преобразуется в long double.

Иначе если операнд имеет тип double,

то второй операнд преобразуется в double.

Иначе если операнд имеет тип float

то второй операнд преобразуется в float,

Иначе если операнд имеет тип unsigned long,

то второй операнд преобразуется в unsigned long.

Иначе если операнд имеет тип long,

то второй операнд преобразуется в long.

Иначе если операнд имеет тип unsigned int,

то второй операнд преобразуется в unsigned int.

Кроме того, действует правило: если один из операндов имеет тип long, а второй – unsigned int, значение unsigned int не может быть представлено типом long, то оба операнда преобразуются в значение типа unsigned long.

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

В приводимых ниже программах используются такие средства ввода-вывода, как printf(), getchar(), gets(), scanf(). Приведем характеристику данных функций в соответствии с их прототипами [4].

Прототип функции printf() имеет следующий вид:

int printf(const char**format, ¼);

Функция printf() записывает в стандартный поток stdout (стандартный выходной поток данных) значения аргументов из заданного списка в соответствии со строкой форматирования, адресуемой параметром format. Строка форматирования состоит из элементов двух типов. К элементам первого типа относятся символы, которые выводятся на экран. Элементы второго типа содержат спецификации формата, определяющий способ отображения аргументов. Спецификация формата начинается символом процента %, за которым следует код формата. На спецификации могут воздействовать модификаторы, задающие ширину поля, точность и признак выравнивания по левому краю. Целое значение, расположенное между % и командой форматирования, играет роль спецификации минимальной ширины поля. Наличие этого спецификатора приводит к тому, что результат будет заполнен пробелами или нулями, чтобы выводимое значение занимало поле, ширина которого не меньше заданной минимальной ширины. По умолчанию в качестве заполнителя используется пробел (пробелы). Для заполнения нулями перед спецификацией ширины поля нужно поместить нуль. Например, спецификация формата %05d дополнит нулями выводимое целое число, в котором менее пяти цифр, чтобы общая длина равнялась пяти символам. Действие модификатора точности зависит от кода формата, к которому он применяется. Чтобы добавить этот модификатор, следует поставить за спецификатором ширины поля десятичную точку, а после нее – требуемое значение точности (число знаков после десятичной точки). Применительно к целым числам модификатор точности задает минимальное количество выводимых цифр. При необходимости перед целым числом будут добавлены нули. Если данный модификатор применяется к строкам, то число, следующее за точкой, задает максимальную длину поля. Например, спецификация %5.7s выведет строку длиной не менее пяти, но не более семи символов. Если выводимая строка окажется длиннее максимальной длины поля, конечные символы будут отсечены. По умолчанию все выводимые значения выравниваются по правому краю: если ширина поля больше выводимого значения, то оно будет выровнено по правому краю поля. Чтобы установить выравнивание по левому краю, нужно поставить знак «минус» («–») сразу после знака процента. Например, спецификация формата %–10.4f обеспечит выравнивание вещественного числа с четырьмя десятичными знаками по левому краю в 10-символьном поле. Существуют два модификатора формата, позволяющие функции printf() отображать короткие и длинные целые числа. Модификатор l (латинская буква «эль») уведомляет функцию printf() о длинном типе значения. Модификатор h сообщает функции printf(), что нужно вывести число короткого целого типа. Кроме того, модификатор l можно поставить перед командами форматирования вещественных чисел, в этом случае он уведомит о выводе значения типа long double.

Спецификаторы формата для функции printf() перечислены в табл. 2.3 [3].


 

Таблица 2.3
Спецификаторы формата функции printf()
Код Формат
%c %d %i %e %E %f %F %g %G %o %c %u %x %X %p %n %% Символ Десятичное целое число со знаком Десятичное целое число со знаком Экспоненциальное представление числа (в виде мантиссы и порядка, е — на нижнем регистре) Экспоненциальное представление числа (в виде мантиссы и порядка, Е — на верхнем регистре) Десятичное число с плавающей точкой Десятичное число с плавающей точкой (только стандарт С99; если применяется к бесконечности или нечисловому значению, то выдает надписи INF, INFINITY(бесконечность) или NAN (not a number) на верхнем регистре. Спецификатор %f выводит их эквиваленты на нижнем регистре) Использует более короткий из форматов %e или %f Использует более короткий из форматов %E или %F Восьмеричное число без знака Символьная строка Десятичное целое число без знака Шестнадцатеричное без знака (строчные буквы) Шестнадцатеричное без знака (прописные буквы) Выводит указатель Соответствующий аргумент должен быть указателем на целое число. (Этот спецификатор указывает, что в целочисленной переменной, на которую указывает ассоциированный с данным спецификатором указатель, будет храниться число символов, выведенных к моменту обработки спецификации %n) Выводит знак процента  

Прототип функции getchar() имеет вид

int getchar(void);

Функция getchar() возвращает из стандартного потока stdin (входного потока данных) следующий символ. При чтении символа предполагается, что он имеет тип unsigned char, который потом преобразуется в целый. При достижении конца файла, как и при обнаружении ошибки, функция getchar() возвращает значение EOF (end of file – конец файла).

Прототип функции gets имеет следующий вид:

char**gets(char**str);

Функция gets() читает символы (включая пробелы) из стандартного потока stdin и помещает их в массив символов, адресуемый указателем *str (далее – массив символов). Символы читаются до тех пор, пока не встретится разделитель строк или значение EOF. Для реализации EOF на клавиатуре следует набрать одновременно Ctrl + Z. Вместо разделителя строк в конец строки вставляется нулевой символ, свидетельствующий о ее завершении. Следует учесть, что не существует способа ограничить количество символов, которое прочитает функция gets(). Поэтому массив, адресуемый указателем *str, может переполниться, и тогда программа выдаст непредсказуемые результаты.

Прототип функции scanf() имеет вид

int scanf(const char**format, ¼);

Функция scanf() представляет собой функцию для ввода данных общего назначения, которая читает поток stdin и сохраняет информацию в переменных, перечисленных в списке аргументов. Если в строке форматирования встретится разделитель, то функция scanf() пропустит один или несколько разделителей во входном потоке. Под разделителем, или пробельным символом, подразумевают пробел, символ табуляции \t или разделитель строк \n. Все переменные должны передаваться посредством своих адресов, например с помощью символа &;. Управляющая строка, задаваемая параметром format, состоит из символов трех категорий: спецификаторов формата; пробельных символов; символов, отличных от пробельных [4].

Спецификация формата начинается знаком % и сообщает функции scanf() тип данного, которое будет прочитано. Спецификации формата функции scanf() приведены в табл. 2.4.

Таблица 2.4
Спецификаторы формата функцииscanf()
Код Формат
%c %d %i %u %hd %e %E %f %lf %F %g %G %o %x %X %c %p %n %[ ] %% Читает один символ Читает десятичное целое число Читает целое число в любом формате (десятичное, восьмеричное или шестнадцатеричное) Читает беззнаковое целое десятичное число Читает десятичное целое число типа short int Читает число с плавающей точкой (и в экспоненциальной форме) Аналогично коду %e Читает число с плавающей точкой Читает десятичное число с плавающей точкой типа double Аналогично коду %f (для стандарта С99) Читает число с плавающей точкой. Аналогично коду %g Читает восьмеричное число Читает шестнадцатеричное число Аналогично коду %x Читает строку Читает указатель Принимает целое значение, равное количеству прочитанных до сих пор символов Просматривает набор символов Читает знак процента

Строка форматирования читается слева направо, и спецификации формата сопоставляются с аргументом в порядке их перечисления в списке аргументов. Символ *, стоящий после знака % и перед кодом формата, прочитает данные заданного типа, но запретит их присваивание. Команды форматирования могут содержать модификатор максимальной длины поля. Он представляет собой целое число, располагаемое между знаком % и кодом формата, которое ограничивает количество читаемых для всех полей символов. Если входной поток содержит больше заданного количества символов, то при последующем обращении к операции ввода чтение начнется с того места, в котором «остановился» предыдущий вызов функции scanf() [13]. Если разделитель (например, пробел) встретится раньше, чем достигнута максимальная ширина поля, то ввод данных завершится. В этом случае функция scanf() переходит к чтению следующего поля. При чтении одиночных символов символы табуляции и разделители строк читаются подобно любому другому символу.

В программах бывает необходимость определять константы. В языке С типы констант можно задавать явно при использовании суффиксов. Например:

long int j = –12345678L; /* суффикс L */

unsigned int a = 678U; /* суффикс U */

float x = 123.45F; /* суффикс F */

long double z = 12345678.99L; /* суффикс L* /

По умолчанию спецификации f, e, g заставляют функцию scanf() присваивать вводимым переменным тип float. Если перед одной из этих спецификаций поставить модификатор l, то функция scanf() присвоит прочитанные данные переменной типа double.

Функция scanf() поддерживает спецификатор формата общего назначения, называемый набором сканируемых символов. В этом случае определяется набор символов, которые могут быть прочитаны функцией scanf() и присвоены соответствующему массиву символов. Для определения такого набора символы, подлежащие сканированию, необходимо заключить в квадратные скобки. Открывающая квадратная скобка должна следовать сразу за знаком процента. При использовании набора сканируемых символов функция scanf() продолжает читать символы и помещать их в соответствующий массив до тех пор, пока не встретится символ, отсутствующий в данном наборе. Если первым символом в наборе является знак ^, то получится обратный эффект: входное поле будет читать до тех пор, пока не встретится символ из заданного набора сканируемых символов, т. е. знак ^ заставляет функцию scanf() читать только те символы, которые отсутствуют в наборе сканируемых символов. Если в строке форматирования встретился символ, отличный от разделителя, то функция scanf() прочитает и отбросит его. Если заданный символ не найден, то функция scanf() завершает работу.

В таких средах разработки, как MS Visual Studio 2008 и 2010, рекомендуется в целях безопасности применять функции gets_s() и scanf_s(). Для них при чтении символа или строки следует указать размер в байтах, соответственно для символа или строки. Например, scanf_s("%c", &ch, 1). В Visual Studio 2010 тип данных char занимает 1 байт.


 







Дата добавления: 2015-09-06; просмотров: 607. Нарушение авторских прав; Мы поможем в написании вашей работы!



Важнейшие способы обработки и анализа рядов динамики Не во всех случаях эмпирические данные рядов динамики позволяют определить тенденцию изменения явления во времени...

ТЕОРЕТИЧЕСКАЯ МЕХАНИКА Статика является частью теоретической механики, изучающей условия, при ко­торых тело находится под действием заданной системы сил...

Теория усилителей. Схема Основная масса современных аналоговых и аналого-цифровых электронных устройств выполняется на специализированных микросхемах...

Логические цифровые микросхемы Более сложные элементы цифровой схемотехники (триггеры, мультиплексоры, декодеры и т.д.) не имеют...

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

ПУНКЦИЯ И КАТЕТЕРИЗАЦИЯ ПОДКЛЮЧИЧНОЙ ВЕНЫ   Пункцию и катетеризацию подключичной вены обычно производит хирург или анестезиолог, иногда — специально обученный терапевт...

Ситуация 26. ПРОВЕРЕНО МИНЗДРАВОМ   Станислав Свердлов закончил российско-американский факультет менеджмента Томского государственного университета...

Гидравлический расчёт трубопроводов Пример 3.4. Вентиляционная труба d=0,1м (100 мм) имеет длину l=100 м. Определить давление, которое должен развивать вентилятор, если расход воздуха, подаваемый по трубе, . Давление на выходе . Местных сопротивлений по пути не имеется. Температура...

Огоньки» в основной период В основной период смены могут проводиться три вида «огоньков»: «огонек-анализ», тематический «огонек» и «конфликтный» огонек...

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

Studopedia.info - Студопедия - 2014-2024 год . (0.008 сек.) русская версия | украинская версия