Преобразование типов производится либо неявно, например при преобразовании по умолчанию или в процессе присваивания, либо явно, путем выполнения операции приведения типа. Преобразование типов выполняется также, когда преобразуется значение, передаваемое как аргумент функции. Далее рассматриваются правила преобразования для каждого из этих случаев.
Преобразования типов при присваивании
В операциях присваивания тип значения, которое присваивается, преобразуется к типу переменной, получающей это значение. Преобразования при присваивании допускаются даже в тех случаях, когда они влекут за собой потерю информации.
Тип longd ouble ведет себя в преобразованиях аналогично типу double.
Преобразования знаковых целых типов Знаковое целое значение преобразуется к короткому знаковому целому значению ( short signed int) посредством усечения старших битов. Знаковое целое значение преобразуется к длинному знаковому целому значению ( long signed int) путем расширения знака влево. Преобразование знаковых целых значений к плавающим значениям происходит путем преобразования к типу long, а затем преобразования к плавающему типу. При этом возможна некоторая потеря точности. При преобразовании знакового целого значения к беззнаковому целому значению ( unsigned int) производится лишь преобразование к размеру беззнакового целого типа, и результат интерпретируется как беззнаковое целое значение.
Правила преобразования знаковых целых типов приведены в таблице 4.2. Предполагается, что тип charпо умолчанию является знаковым. Если во время компиляции используется опция, которая изменяет умолчание для типа charсо знакового на беззнаковый, то для него выполняется преобразование как для типа unsigned char(см. таблицу 4.3).
Таблица 4.2.
Преобразование знаковых целых типов
От типа |
К типу |
Метод |
char |
short |
дополнение знаком |
char |
long |
дополнение знаком |
char |
unsigned char |
сохранение битового представления; |
char |
unsigned short |
старший бит теряет функцию знакового бита дополнение знаком до short; преобразование short в unsigned short |
char |
unsigned long |
дополнение знаком до long; преобразование long в unsigned long |
char |
float |
дополнение знаком до long; преобразование long к float |
char |
double |
дополнение знаком до long; преобразование long к double |
short |
char |
сохранение младшего байта |
short |
long |
дополнение знаком |
short |
unsigned char |
сохранение младшего байта |
short |
unsigned short |
сохранение битового представления; старший бит теряет функцию знакового бита |
short |
unsigned long |
дополнение знаком до long; преобразование long в unsigned long |
short |
float |
дополнение знаком до long; преобразование long к float |
short |
double |
дополнение знаком до long; преобразование long к double |
long |
char |
сохранение младшего байта |
long |
short |
сохранение младшего слова |
long |
unsigned char |
сохранение младшего байта |
long |
unsigned short |
сохранение младшего слова |
long |
unsigned long |
сохранение битового представления; старший бит теряет функцию знакового бита |
long |
float |
представляется как float; возможна некоторая потеря точности |
long |
double |
представляется как double; возможна некоторая потеря точности |
Примечание. В СП MSC и СП ТС тип intэквивалентен типу shortи преобразование для типа intпроизводится как для типа short. В некоторых реализациях языка Си тип intэквивалентен типу longи преобразование для типа intпроизводится как для типа long.
Преобразование беззнаковых целых типов
Беззнаковое целое значение преобразуется к короткому беззнаковому целому значению или короткому знаковому целому значению путем усечения старших битов. Беззнаковое целое значение преобразуется к длинному беззнаковому целому значению или длинному знаковому целому значению путем дополнения нулями слева. Беззнаковое целое значение преобразуется к значению с плавающей точкой путем преобразования к типу long, а затем преобразования значения типа longк значению с плавающей точкой.
Если беззнаковое целое значение преобразуется к знаковому целому значению того же размера, то битовое представление не меняется. Однако, если старший (знаковый) бит был установлен в единицу, представляемое значение изменится.
Читать дальше