Правила преобразования беззнаковых целых типов приведены в таблице 4.3.
Таблица 4.3.
Преобразование беззнаковых целых типов
От типа |
К типу |
Метод |
unsigned char |
char |
сохранение битового представления; старший бит становится знаковым |
unsigned char |
short |
дополнение нулевыми битами |
unsigned char |
long |
дополнение нулевыми битами |
unsigned char |
unsigned short |
дополнение нулевыми битами |
unsigned char |
unsigned long |
дополнение нулевыми битами |
unsigned char |
float |
дополнение нулевыми битами до long; преобразование long к float |
unsigned char |
double |
дополнение нулевыми битами до long; преобразование long к double |
unsigned short |
char |
сохранение младшего байта |
unsigned short |
short |
сохранение битового представления; старший бит становится знаковым |
unsigned short |
long |
дополнение нулевыми битами |
unsigned short |
unsigned char |
сохранение младшего байта |
unsigned short |
unsigned long |
дополнение нулевыми битами |
unsigned short |
float |
дополнение нулевыми битами до long; преобразование long к float |
unsigned short |
double |
дополнение нулевыми битами до long; преобразование long к double |
unsigned long |
char |
сохранение младшего байта |
unsigned long |
short |
сохранение младшего слова |
unsigned long |
long |
сохранение битового представления; старший бит становится знаковым |
unsigned long |
unsigned char |
сохранение младшего байта |
unsigned long |
unsigned short |
сохранение младшего слова |
unsigned long |
float |
преобразование к long; преобразование long к float |
unsigned long |
double |
преобразование к long; преобразование long к double (в версии 5 СП MSC это преобразование производится напрямую, без промежуточного типа long) |
Примечание . В СП MSC и СП ТС тип unsigned intэквивалентен типу unsigned shortи преобразование для типа unsigned intпроизводится как для типа unsigned short. В некоторых реализациях языка Си тип unsigned intэквивалентен типу unsigned longи преобразование для типа intпроизводится как для типа unsigned long.
Преобразование плавающих типов Значения типа floatпреобразуются к типу doubleбез потери точности. Значения типа doubleпри преобразовании к типу floatпредставляются с некоторой потерей точности. Однако если порядок значения типа doubleслишком велик для представления экспонентой значения типа float, то происходит потеря значимости, о чем сообщается во время выполнения.
Значения с плавающей точкой преобразуются к целым типам в два приема: сначала производится преобразование к типу long, а затем преобразование этого значения типа longк требуемому типу. Дробная часть плавающего значения отбрасывается при преобразовании к long; если полученное значение слишком велико для типа long, то результат преобразования не определен. Правила преобразования плавающих типов приведены в таблице 4.4.
Таблица 4.4.
От типа |
К типу |
Метод |
float |
char |
преобразование к long; преобразование long к char |
float |
short |
преобразование к long; преобразование long к short |
float |
long |
усечение дробной части; результат не определен, если он слишком велик для представления типом long |
float |
unsigned short |
преобразование к long; преобразование long к unsigned short |
float |
unsigned long |
преобразование к long; преобразование long к unsigned long |
float |
double |
дополнение мантиссы нулевыми битами справа |
double |
char |
преобразование к float; преобразование float к char |
double |
short |
преобразование к float; преобразование float к short |
double |
long |
усечение дробной части; результат не определен, если он слишком велик для представления типом long |
double |
unsigned short |
преобразование к long; преобразование long к unsigned short |
double |
unsigned long |
преобразование к long; преобразование long к unsigned long |
double |
float |
усечение младших битов мантиссы; возможна потеря точности; если значение слишком велико для представления типом float, то результат преобразования не определен |
Преобразование указателей
Указатель на значение одного типа может быть преобразован к указателю на значение другого типа. Результат может, однако, оказаться неопределенным из-за отличий в требованиях к выравниванию объектов разных типов и в размере памяти, занимаемом различными типами.
Читать дальше